1 寻找一个项目
进入一个python项目,这里我用的是之前写的项目myproject

2 步骤
2.1 在项目的目录下编写i18n.py文件
例如我的路径是:
myproject/myproject目录下面
内容如下:
# -*- encoding: utf-8 -*-

import  oslo_i18n

# ref: https://docs.openstack.org/oslo.i18n/ocata/usage.html

DOMAIN = "myproject"

_translators = oslo_i18n.TranslatorFactory(domain=DOMAIN)

_ = _translators.primary

_LI = _translators.log_info
_LW = _translators.log_warning
_LE = _translators.log_eror
_LC = _translators.log_critical

def get_available_languages():
    return oslo_i18n.get_available_languages(DOMAIN)

def translate(value, user_locale):
    return oslo_i18n.translate(value, user_locale)

2.2 引用_,_LI等
from myproject.i18n import _, _LI

LOG.info(_LI('enter app_factory'))
或者这种用法,推荐用_而不是_LI
    result = _('enter app_factory')
    LOG.info(result)
经过验证:
发现现在_LI不能被国际化翻译了,_是可以的

3 准备po和mo文件
3.0 基础
PO:
含义: 可移植对象(portable object)。
作用: 被翻译人员使用的资源文件,gettext软件包会处理PO文件

MO:
含义: 机器对象(machine object)
作用: 面向计算机由PO文件通过gettext编译成的二进制文件,程序读取MO文件
使界面转换成用户使用的语言

po文件转换为mo文件: 使用msgfmt和pygettext

无需安装gettext:
因为已经在python的标准库中了,参考:
https://docs.python.org/2.7/py-modindex.html#cap-g

使用方法:
import gettext

/usr/lib/python2.7/site-packages/oslo_i18n

具体用法参见:
gettext.gettext(message)
Return the localized translation of message, based on the current global domain, language, and locale directory. This function is usually aliased as _() in the local namespace (see examples below).

https://docs.python.org/2.7/library/gettext.html#module-gettext

参考:
https://blog.csdn.net/ANXIN997483092/article/details/79539203
https://docs.openstack.org/oslo.i18n/ocata/usage.html
https://docs.openstack.org/oslo.i18n/latest/reference/index.html#oslo_i18n.translate

3.1 创建PO文件
xgettext -k_ -o i18n_demo.pot --from-code=UTF-8 i18n_demo.py

通过:
xgettext --help
查询到用法:
作用: 从给定的输入文件中提取出可翻译的字符串
用法: xgettext [选项] [输入文件]
-k: --keyword, 不使用默认关键字
-o: --output, 将输出写入指定文件
--from-code=名称 :输入文件的编码,例如 UTF-8
-D: --directory=目录, 在目录中查找输入文件

实际命令:
xgettext -k_ -o myproject.pot --from-code=UTF-8 app.py
最终执行
xgettext -k_LI -o myproject.pot --from-code=UTF-8 app.py

生成文件内容如下所示:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-05 15:25+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: app.py:29
msgid "enter app_factory"
msgstr ""

注意:
需要去除pot中的
#
#, fuzzy
否则会导致后续翻译失败。

同时指定多个关键字:
只需要同时指定多个 -k即可
xgettext -k_LI -k_LW -o myproject.pot --from-code=UTF-8 app.py

从指定目录下提取多个文件的待翻译字符串:
xgettext -k_LI -k_LW -o myproject.pot --from-code=UTF-8 --directory=/home/machao/myproject/test_project/myproject
发现这个不可以

两种解决方法:
方法1:
find /home/cawa/www/deploy/module/Nav/ -type f \( -name '*.php' -or -name '*.phtml' \)  -print > list
xgettext --files-from=list --language=PHP -j messages.po

方法2:
进入到项目目录下
find . -iname "*.py" | xargs xgettext -k_LI -k_LW -k_LE -k_LC -k_ --from-code=UTF-8 -o myproject.pot

最终采用方法2。

参考:
https://stackoverflow.com/questions/12671270/how-to-use-xgettext-how-to-parse-directory

修改app.py, students.py

参考:
https://blog.csdn.net/weixin_34137799/article/details/87705189#
https://www.atjiang.com/gnu-gettext-intro/

3.2 aodh中的i18n用法
i18n用法参考aodh的源码文件:
用法1: _LE
            LOG.error(
                _LE("Action %(scheme)s for alarm %(alarm_id)s is unknown, "
                    "cannot notify"),
                {'scheme': scheme, 'alarm_id': alarm_id})

用法2: _
        LOG.info(_(
            "Notifying alarm %(alarm_name)s %(alarm_id)s of %(severity)s "
            "priority from %(previous)s to %(current)s with action %(action)s"
            " because %(reason)s.") % ({'alarm_name': alarm_name,
                                        'alarm_id': alarm_id,
                                        'severity': severity,
                                        'previous': previous,
                                        'current': current,
                                        'action': action,
                                        'reason': reason}))

用法3: _
                error = _('%(name)s count exceeds maximum value '
                          '%(maximum)d') % {"name": actions_name,
                                            "maximum": max_actions}
                raise base.ClientSideError(error)

最终生成的内容如下:
[root@localhost myproject]# cat myproject.pot 
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-05 16:20+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: myproject/api/controllers/v1/students.py:57
#, python-format
msgid "delete id: %(id)s"
msgstr ""

#: myproject/api/controllers/v1/students.py:100
#, python-format
msgid "post of StudentsController exception: %(expe)s, message: %(mess)s"
msgstr ""

#: myproject/api/app.py:29
msgid "enter"
msgstr ""

#: myproject/api/app.py:30
msgid "enter app_factory"
msgstr ""

注意:
需要删除
#
#, fuzzy
否则会导致后续国际化翻译失败

3.3 翻译字符串
3.3.1) 导入语言环境变量
即执行如下命令:
如果想使用中文语,执行:
export LC_ALL=zh_CN

如果想使用中文语,执行:
export LC_ALL=en_US

注意:
经过跟踪i18n的源码发现,i18n中需要设置语言环境变量,语言环境变量从高到低的优先级为:
LC_ALL, LC_TYPE, LC_LANG
如果设置LC_ALL就不需要设置LC_TYPE和LC_LANG。

3.3.2) 导入翻译文件目录的环境变量
即执行如下命令:
export MYPROJECT_LOCALEDIR='/root/myproject/myproject/myproject/locale'

注意:
1)
/root/myproject/myproject/myproject/locale这个目录中的结构如下:
├── locale
│   ├── en
│   │   └── LC_MESSAGES
│   │       ├── myproject.mo
│   │       └── myproject.po
│   ├── myproject.pot
│   └── zh_CN
│       └── LC_MESSAGES
│           ├── myproject.mo
│           └── myproject.po
locale下面的一级目录是各个语言,例如en,zh_CN;基于语言的目录下的子目录必须是
LC_MESSAGES,最后LC_MESSAGES目录下存放的是:
xxx.po,每个xxx.po有一个对应的xxx.mo文件

请根据实际情况修改对应自己项目的LOCALEDIR环境变量。

2) 注意环境变量名称的命名规则如下
获取步骤2.1中i18n.py的DOMAIN变量,例如我的是
DOMAIN = 'myproject'
将'myproject'转换为大写,即'MYPROJECT',然后拼接 _LOCALEDIR,
其中拼接的内容:  _LOCALEDIR 是不变的,这是i18n要求,否则国际化翻译无效。

看一下对应的目录结构:
[root@localhost myproject]# tree
.
├── api
......
├── i18n.py
├── __init__.py
├── locale
│   ├── en
│   │   └── LC_MESSAGES
│   │       ├── myproject.mo
│   │       └── myproject.po
│   ├── myproject.pot
│   └── zh_CN
│       └── LC_MESSAGES
│           ├── myproject.mo
│           └── myproject.po
......

3.3.3) 翻译
下面是翻译之后的结果

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-05 16:20+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: myproject/api/controllers/v1/students.py:57
#, python-format
msgid "delete id: %(id)s"
msgstr "删除id: %(id)s"

#: myproject/api/controllers/v1/students.py:100
#, python-format
msgid "post of StudentsController exception: %(expe)s, message: %(mess)s"
msgstr "StudentsController的post异常: %(expe)s, message: %(mess)s"

#: myproject/api/app.py:29
msgid "enter"
msgstr "进入"

#: myproject/api/app.py:30
msgid "enter app_factory"
msgstr "进入app工厂"

3.3.4) 保存为.po文件
将上述已经翻译的.pot文件保存为.po文件

3.4 存放.po文件
1) 新建local目录
进入到当前项目的locale/zh_CN/LC_MESSAGES 目录下(
如果没有该目录就创建),
将刚才保存的.po文件放入该目录下

3.5 生成对应的.mo文件
进入到进入到当前项目的locale/zh_CN/LC_MESSAGES 目录下,
执行如下命令:
msgfmt --statistics --verbose -o myproject.mo myproject.po
作用: 重新生成myproject.mo文件,该文件为信息文件

找到文件编译一下,重启服务就可以

解释:
myproject.mo是编译后的二进制文件
myproject.po是源文件

msgfmt --help
作用: 由文字模式描述生成二进制消息文件
用法: msgfmt [选项] filename.po
输入文件的位置:
文件名.po 是输入文件
-D: 目录,在目录中查找输入文件
-o: --output-file=文件 将输出写入指定文件
-v: --verbose 增加输出的详细成都

msgid "Create ServerGroup"
msgstr "创建主机组"

解释:
msgid: 源文件中出现的待翻译字符串
msgstr:是相应语言的翻译结果

样例运行结果:
[root@localhost LC_MESSAGES]# msgfmt --statistics --verbose -o myproject.mo myproject.po
myproject.po: 4 条已翻译消息.

参考:
https://blog.csdn.net/u013293645/article/details/45692597
https://www.tceic.com/g7856695h90j6i85kj3gi63j.html

3.6 修改配置文件中日志目录
3.6.1) 修改配置文件
样例: 修改/etc/myproject/myproject.conf中的
log_dir,修改为如下形式:
log_dir = /var/log/myproject

3.6.2) 设置调试模式
进入到项目目录下,执行:
pip install -e .

3.6.3) 启动服务

[root@localhost myproject]# /usr/bin/myproject-api --port=8043
######### enter build_wsgi_app
Traceback (most recent call last):
  File "/usr/bin/myproject-api", line 35, in <module>
    server = wss.make_server(args.host, args.port, build_wsgi_app())
  File "/usr/lib/python2.7/site-packages/myproject/api/app.py", line 67, in build_wsgi_app
    conf = service.prepareService()
  File "/usr/lib/python2.7/site-packages/myproject/service.py", line 22, in prepareService
    log.setup(conf, 'myproject')
  File "/usr/lib/python2.7/site-packages/oslo_log/log.py", line 274, in setup
    _setup_logging_from_conf(conf, product_name, version)
  File "/usr/lib/python2.7/site-packages/oslo_log/log.py", line 382, in _setup_logging_from_conf
    filelog = file_handler(logpath)
  File "/usr/lib64/python2.7/logging/handlers.py", line 392, in __init__
    logging.FileHandler.__init__(self, filename, mode, encoding, delay)
  File "/usr/lib64/python2.7/logging/__init__.py", line 902, in __init__
    StreamHandler.__init__(self, self._open())
  File "/usr/lib64/python2.7/logging/__init__.py", line 925, in _open
    stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: '/var/log/myproject/myproject-api.log'

解决方法:
创建日志文件目录,即执行:
mkdir -p /var/log/myproject
然后执行:
touch /var/log/myproject/myproject-api.log

验证:
[root@localhost myproject]# cat /var/log/myproject/myproject-api.log 
2019-05-05 19:05:33.422 12663 INFO myproject.api.app [-] The wsgi config file path is: /etc/myproject/api-paste.ini

3.7 setup.cfg中配置国际化信息

发现在aodh.setup.cfg中有如下内容:
[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg
output_file = aodh/locale/aodh.pot

[compile_catalog]
directory = aodh/locale
domain = aodh

[update_catalog]
domain = aodh
output_dir = aodh/locale
input_file = aodh/locale/aodh.pot

同时在babel.cfg中有如下内容:
[python: **.py]

关于babel解释:
含义: python国际化工具包
extract_messages:
作用: 类似xgettext,从不同的源文件中抽取出待翻译的内容,并生成一个
PO文件(可携带对象)
用法:
$ ./setup.py extract_messages --output-file foobar/locale/messages.pot
running extract_messages
extracting messages from foobar/__init__.py
extracting messages from foobar/core.py
...
writing PO template file to foobar/locale/messages.pot

compile_catalog:
作用: 类似于msgfmt工具,将PO文件编译为一个MO文件
用法:
./setup.py compile_catalog --directory foobar/locale --locale pt_BR
running compile_catalog
compiling catalog to foobar/locale/pt_BR/LC_MESSAGES/messages.mo

update_catalog:
作用: 类似msgmerge,它根据一个PO模板文件(POT)更新一个已经存在的翻译目录

参考:
https://blog.csdn.net/s1234567_89/article/details/53008444

3.9 oslo_i18n中的翻译
Displaying translated messages¶
Several preparations are required to display translated messages in your running application.

Preferred language
You need to specify your preferred language through an environment variable. The preferred language can be specified by LANGUAGE, LC_ALL, LC_MESSAGES, or LANGUAGE (A former one has a priority).

oslo_i18n.translate() can be used to translate a string to override the preferred language.

Note

You need to use enable_lazy() to override the preferred language by using oslo_i18n.translate().

Locale directory
Python gettext looks for binary mo files for the given domain using the path <localedir>/<language>/LC_MESSAGES/<domain>.mo. The default locale directory varies on distributions, and it is /usr/share/locale in most cases.

If you store message catalogs in a different location, you need to specify the location via an environment variable named <DOMAIN>_LOCALEDIR where <DOMAIN> is an upper-case domain name with replacing _ and . with -. For example, NEUTRON_LOCALEDIR for a domain neutron and OSLO_I18N_LOCALEDIR for a domain oslo_i18n.

Note

When you specify locale directories via <DOMAIN>_LOCALEDIR environment variables, you need to specify an environment variable per domain. More concretely, if your application using a domain myapp` uses oslo.policy, you need to specify both ``MYAPP_LOCALEDIR and OSLO_POLICY_LOCALEDIR to ensure that translation messages from both your application and oslo.policy are displayed.

分析:

参考:
https://docs.openstack.org/oslo.i18n/latest/user/usage.html#lazy-translation

3.10 分析horizon的国际化
经过分析:
horizon前端切换语言后,环境变量没有发生变化:
()[root@horizon-77c6c59589-6w9vp LC_MESSAGES]# env|grep LANG
LANG=en_US.UTF-8
()[root@horizon-77c6c59589-6w9vp LC_MESSAGES]# env|grep LANG
LANG=en_US.UTF-8
()[root@horizon-77c6c59589-6w9vp LC_MESSAGES]# env|grep LANG
LANG=en_US.UTF-8

horizon的国际化:
                scope.operationlogi18n = {
                    'Create Instance': gettext('Create Instance'),
                    'Shutdown Instance': gettext('Shutdown Instance'),
           }
实际就是建立了一个字典,
英文字符串到已经翻译的字符串,
翻译本身调用了gettext方法。

4 oslo_i18n的懒加载模式无法在语言发生切换的情况下动态翻译
4.1 现在发现如果我在一个服务启动的时候,此时如果动态
export LC_ALL=xxx,此时无法动态根据新的语言进行翻译。
解决方法:
重启服务之前,重新执行命令:
export LC_ALL=xxx

总结:
如果尝试通过在代码中用os模块来设置MYPROJECT_LOCALEDIR
这个环境变量,会失败,因为该环境变量只存在于刚才设置的那个python shell环境中。
看来必须通过在启动服务之前设置环境变量
例如真实安装aodh的项目路径为:
/usr/lib/python2.7/site-packages/aodh/locale

4.2 k8s环境下语言环境变量的设置
1) 可以在values.yaml中编写如下:
在values.yaml中:
language_map:
  cn: zh_CN
  en: en

AODH_LOCALEDIR: "/usr/lib/python2.7/site-packages/aodh/locale"

2) 在_aodh-notifier.sh.tpl文件中编写
set -ex

export AODH_LOCALEDIR={{ .Values.AODH_LOCALEDIR }}
export LC_ALL={{ index .Values.language_map .Values.conf.aodh.DEFAULT.aodh_lang }}

exec aodh-notifier --config-file=/etc/aodh/aodh.conf

验证是可以生成对应环境变量的。

不要修改的文件: aodh/templates/deployment-notifier.yaml
      containers:
        - name: aodh-notifier
          image: {{ .Values.images.tags.notifier }}
          imagePullPolicy: {{ .Values.images.pull_policy }}
{{ tuple $envAll $envAll.Values.pod.resources.notifier | include "helm-toolkit.snippets.kubernetes_resources" | indent 10 }}
          command:
            - /tmp/aodh-notifier.sh
          env:
            - name: LANG
              value: {{ index .Values.language_map .Values.conf.aodh.DEFAULT.aodh_lang }}
            - name: AODH_LOCALEDIR
              value: {{ .Values.AODH_LOCALEDIR }}
这样修改无效,是因为configmap关于环境变量env是热加载,除了第一次会加载环境变量,后续不会更新。

5  批量抽取待翻译内容,并合并到现有po文件
发现在aodh.setup.cfg中有如下内容:
[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg
output_file = aodh/locale/aodh.pot

[compile_catalog]
directory = aodh/locale
domain = aodh

[update_catalog]
domain = aodh
output_dir = aodh/locale
input_file = aodh/locale/aodh.pot

同时在babel.cfg中有如下内容:
[python: **.py]

关于babel解释:
含义: python国际化工具包
1) 抽取待翻译内容
先进入到该项目的包含setup.py的目录下
请确保有babel.cfg文件,并且该文件内容如下:
[python: **.py]

查看setup.cfg中内容,请确保setup.cfg有如下内容:
[extract_messages]
keywords = _ gettext ngettext l_ lazy_gettext
mapping_file = babel.cfg
output_file = myproject/locale/myproject.pot

注意:
请将上述myproject修改为自己的项目名称

然后执行如下命令:
python setup.py extract_messages --output-file myproject.pot
样例输出结果:
running extract_messages
extracting messages from myproject/__init__.py
extracting messages from myproject/i18n.py
extracting messages from myproject/i18n_demo.py
extracting messages from myproject/opts.py
extracting messages from myproject/service.py
extracting messages from myproject/api/__init__.py
extracting messages from myproject/api/app.py
extracting messages from myproject/api/hooks.py
extracting messages from myproject/api/controllers/__init__.py
extracting messages from myproject/api/controllers/root.py
extracting messages from myproject/api/controllers/v1/__init__.py
extracting messages from myproject/api/controllers/v1/base.py
extracting messages from myproject/api/controllers/v1/root.py
extracting messages from myproject/api/controllers/v1/students.py
extracting messages from myproject/api/controllers/v1/utils.py
extracting messages from myproject/cmd/__init__.py
extracting messages from myproject/cmd/storage.py
extracting messages from myproject/db/__init__.py
extracting messages from myproject/db/base.py
extracting messages from myproject/db/models.py
extracting messages from myproject/db/mariadb/__init__.py
extracting messages from myproject/db/mariadb/impl_mariadb.py
extracting messages from myproject/db/migrate/__init__.py
extracting messages from myproject/db/migrate/alembic/__init__.py
extracting messages from myproject/db/migrate/alembic/env.py
extracting messages from myproject/db/migrate/alembic/versions/677de41920e9_create_student_table.py
extracting messages from myproject/db/migrate/alembic/versions/77cca51ca78e_add_email_to_student.py
extracting messages from myproject/db/migrate/alembic/versions/__init__.py
writing PO template file to myproject.pot

生成的myproject.pot的内容如下:
# Translations template for myproject.
# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the myproject project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: myproject 0.0.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2019-05-07 13:33+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.6.0\n"

#: myproject/api/app.py:67 myproject/i18n_demo.py:14
msgid "enter"
msgstr ""

#: myproject/api/app.py:43
#, python-format
msgid ""
"<html><body><p>alarm name/id: %(name)s/%(id)s</p><p>metric: "
"%(meter)s</p><p>alarm severity: %(severity)s</p><p>latest sample value: "
"%(value)s</p><p>detail information: latest sample value is greater than "
"threshold,please check the threshold of current alarm "
"%(name)s</p><p>alarm time: %(timestamp)s</p></body></html>

python 64式: 第24式、python项目国际化翻译实战相关推荐

  1. 24式加速你的Python

    作者 | 梁云1991 来源 Python与算法之美 一.分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(j ...

  2. 24 式加速你的 Python

    一,分析代码运行时间 第1式,测算代码运行时间 平凡方法 快捷方法(jupyter环境) 第2式,测算代码多次运行平均时间 平凡方法 快捷方法(jupyter环境) 第3式,按调用函数分析代码运行时间 ...

  3. python中三目运算符、推导式 ## 17

    三目运算符是精简代码的优化手段,在一定场景可以适用 比如下面给大家举个例子 例1: score = 89 print("A" if score > 80 else " ...

  4. Python教程:列表推导式和嵌套的列表推导式讲解

    1.列表推导式 列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我 ...

  5. Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery

    PyQuery:一个类似jquery的python库 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 BeautifulSoup 美味 ...

  6. Python笔记002-列表推导式

    Python笔记002-列表推导式 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...

  7. Python 推导式(列表推导式,字典推导式,集合推导式)

    Python的各种推导式 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导. 列表推导式 字典推 ...

  8. Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)

    1.背景 指针式机械表盘具有安装维护方便.结构简单.防电磁干扰等诸多优点, 目前广泛应用于工矿企业.能源及计量等部门.随着仪表数量的增加及精密仪表技术的发展,人工判读已经不能满足实际应用需求.随着计算 ...

  9. Python学习笔记 —— 独步天下推导式语法糖

    Python学习笔记 -- 独步天下推导式语法糖 前言 介绍 列表推导式 获取当月天数 字典推导式 模拟三条用户数据 结束语 前言 最近心血来潮,学习了一下Python,其中关于 推导式语法糖 感觉功 ...

最新文章

  1. 你想要的宏基因组-微生物组知识全在这(181001)
  2. python中清除海龟图的代码_Python海龟绘图——常用方法指令
  3. 隐马尔科夫模型C#语言算法实现
  4. 【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入
  5. System类的概述和方法使用
  6. linux 的一些实用工具,linux 命令行下的一些实用工具
  7. 巴西矿坝决堤事故已致58人死亡 多达300人失踪
  8. STM32F103代码远程升级(六)基于小米IoT开发者平台远程升级代码的实现
  9. 树莓派外接显示器黑屏_解决树莓派连接显示屏No Signal的问题
  10. Word2003快速操作技巧及常用快捷键使用
  11. 堆溢出(二)空表DWORD SHOOT
  12. 用vue实现动态组织结构图
  13. 关于onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
  14. Codeforces 1034 A
  15. 灵隐寺招聘:没有KPI、佛系上班、一切随缘
  16. 30种常见补肾食物,不看绝对会后悔
  17. 【KV260】利用XADC生成芯片温度曲线图
  18. markdown文档规范练习
  19. Android 分贝测试仪功能,你会的还只有初级Android工程师的技术吗
  20. 最新中台架构PPT,一起欣赏6大互联网大厂的架构图

热门文章

  1. 标识符的命名和使用 规则
  2. jQuery插件初级练习5答案
  3. 通过Docker容器搭建私有网盘(NextCloud)
  4. 手机实现实时人脸识别(二)
  5. 怎么拿到签到王者的勋章?
  6. [ html5 ] 图片默认外边框
  7. 拼多多登陆 JS 密码字段加密解析
  8. 嵌入式--LCD常用接口介绍
  9. 酷炫多彩的个性化词云可视化
  10. java windows 打印机_windows系统 TSC 打印机的JAVA实现