澳门新葡萄京娱乐网站-澳门新葡萄京888官网-所有平台

热门关键词: 澳门新葡萄京娱乐网站,澳门新葡萄京888官网

这些Python代码技巧,交叉编译

作者: 编程知识  发布:2019-12-11

3.collections

Python 有一些很棒的默认数据类型,但有时候它们可能不会尽如你意。

不过,Python 标准库提供了 collections 模块。这个方便的附加组件可以为你提供更多数据类型。

collections 模块:https://docs.python.org/3/library/collections.html

from collections import OrderedDict, Counter
# Remembers the order the keys are added!
x = OrderedDict(a=1, b=2, c=3)
# Counts the frequency of each character
y = Counter("Hello World!")

   

当您想要编写可以处理未事先定义的命名参数的函数时,这非常有用。

创建 build 目录

在 python 源代码下创建 build-pcbuild-mips 目录,分别用于编译 PC pgen(交叉编译时用到)与交叉编译 mips python。该目录做 configure、make、make install,编译时用于保存临时生成的文件,保证 python 源代码干净。

18.__repr__

在 Python 中定义一个类别或对象时,以「官方」方式将对象表示为字符串很有用。例如:

>>> file = open('file.txt', 'r')
>>> print(file)
<open file 'file.txt', mode 'r' at 0x10d30aaf0>

  

这使代码 debug 变得简单很多。将字符串添加到类别定义,如下所示:

class someClass:
    def __repr__(self):
        return "<some description here>"
someInstance = someClass()
# prints <some description here>
print(someInstance)

 

YAML代表' YAML Is Not Markup Language '。它是一种数据格式化语言,是JSON的超集。

附一:Python 内建模块功能说明

直接引自 定制 Python 嵌入 C++: (四) 定制 Python 内建模块,内容可能已过时,不过有参考价值。

  1. array (Modules/arraymodule.c) (http://docs.python.org/library/array.html) 一个可以存放基本类型的高效数组, 提供了和序列类似的操作. 使用放法类似于 a = array.array('b', [10, 20, 30]), 不常使用, 可以考虑去除.
  2. _ast (Python/Python-ast.c) (http://docs.python.org/library/ast.html) 抽象语法树, 供 Python 程序解析处理 Python 语法相关的库, 这个模块的源代码是由脚本自动生成的. 由于 Python-ast.c 本身还会被解释器的其它地方引用, 不能删除, 所以, 如果是为了压缩解释器大小, 保留这个库也没关系. 如果是为了定制 python 的功能, 也可以屏蔽这个库, 但是源代码需要保留, 不能从工程中删掉.
  3. audioop (Modules/audioop.c) (http://docs.python.org/library/audioop.html) 一个音频处理的库, 仅 Win32 平台有效.
  4. binascii (Modules/binascii.c) (http://docs.python.org/library/binascii.html) 提供二进制和 ASCII 码的转换, 会被 uu, base64, binhex 这些库引用. 建议保留.
  5. cmath (Modules/cmathmodule.c) (http://docs.python.org/library/cmath.html) 提供复数操作的函数
  6. errno (Modules/errnomodule.c) (http://docs.python.org/library/errno.html) 提供标准的错误码定义, 在很多地方中都会使用, 需要保留.
  7. future_builtins (Modules/future_builtins.c) (http://docs.python.org/library/future_builtins.html) 对那些在 Python2.x 和 Python3 中都有但是意义不一样的函数提供的包装. 使用这里面的函数可以保证调用了正确的版本的函数.
  8. gc (Modules/gcmodule.c) (http://docs.python.org/library/gc.html) Python 的垃圾收集接口. 当然保留.
  9. imageop (Modules/imageop.c) (http://docs.python.org/library/imageop.html) 一些图像处理的函数.
  10. math (Modules/mathmodule.c) (http://docs.python.org/library/math.html) 提供了 C 标准库中的那些数学函数.
  11. _md5 (Modules/md5module.c) 提供了 MD5 算法.
  12. nt (Modules/posixmodule.c) 一些操作系统习惯的函数, 比如打开文件等等.
  13. operator (Modules/operator.c) (http://docs.python.org/library/operator.html) 提供了操作符的等价函数
  14. signal (Modules/signalmodule.c) (http://docs.python.org/library/signal.html) 信号机制, 提供异步事件的回调.
  15. _sha, _sha256, _sha512 三种 SHA 的加密算法模块.
  16. strop (Modules/stropmodule.c) 提供了一些优化的字符串操作.
    17.time (Modules/timemodule.c) (http://docs.python.org/library/time.html) 时间操作库.
  17. thread (Modules/threadmodule.c) Python 线程的底层模块, threading 会使用 thread 库.
  18. cStringIO (Modules/cStringIO.c) (http://docs.python.org/library/stringio.html) StringIO 的高效版本.
  19. cPickle (Modules/cPickle.c) (http://docs.python.org/library/pickle.html) Python 的序列化模块.
  20. msvcrt (PC/msvcrtmodule.c) (http://docs.python.org/library/msvcrt.html) VC 运行时库的包装, 包括一些文件和屏幕操作函数.
  21. _locale (Modules/_localemodule.c) 提供本地化支持的模块.
  22. _subprocess (PC/_subprocess.c) (http://docs.python.org/library/subprocess.html) 操作子进程的库, 平台相关的.
  23. _codecs (Modules/_codecsmodule.c) (http://docs.python.org/library/codecs.html) 定义了 Python 的编码器相关接口.
  24. _weakref (Modules/_weakref.c) (http://docs.python.org/library/weakref.html) 创建对象的弱引用.
  25. _hotshot (Modules/_hotshot.c) (http://docs.python.org/library/hotshot.html) 类似于 Profiler 模块, 而且将来可能被移除, 现在把它去掉也不错.
  26. _random (Modules/_randommodule.c) 随机数模块.
  27. _bisect (Modules/_bisectmodule.c) (http://docs.python.org/library/bisect.html) 一个基于二分算法, 可以让插入一个数据岛排序的序列后序列仍然有序的库.
  28. _heapq (Modules/_heapqmodule.c) (http://docs.python.org/library/heapq.html) 实现堆栈数据结构算法的库.
  29. _lsprof (Modules/_lsprof.c) (http://docs.python.org/library/profile.html) Profiler 模块, 统计程序执行的性能.
  30. itertools (Modules/itertoolsmodule.c) (http://docs.python.org/library/itertools.html) 一些迭代器操作的模块.
  31. _collections (Modules/_collectionsmodule.c) (http://docs.python.org/library/collections.html) 提供了几个高级的容器类.
  32. _symtable (Modules/symtablemodule.c) (http://docs.python.org/library/symtable.html) 符号表管理模块.
  33. mmap (Modules/mmapmodule.c) (http://docs.python.org/library/mmap.html) 文件内存映射支持模块.
  34. _csv (Modules/_csv.c) (http://docs.python.org/library/csv.html) 为 CSV 模块的内部支持. CSV 模块提供了读写 CSV 文件的功能.
  35. _sre (Modules/_sre.c) 正则表达式的匹配引擎.
  36. parser (Modules/parsermodule.c) (http://docs.python.org/library/parser.html) 操作 Python 语法树的模块.
  37. _winreg (PC/_winreg.c) Windows 注册表操作模块.
  38. _struct (Modules/_struct.c) 提供在 Python 和 C 之间转换数据类型的功能.
  39. datetime (Modules/datetimemodule.c) (http://docs.python.org/library/datetime.html) 日期时间操作函数.
  40. _functools (Modules/_functoolsmodule.c) (http://docs.python.org/library/functools.html) 函数相关操作模块.
  41. _json (Modules/_json.c) (http://docs.python.org/library/json.html) JSON 数据格式操作模块.
  42. xxsubtype (Modules/xxsubtype.c) 这是一个测试相关的模块. 运行 test_descr.py 时会用到.
  43. zipimport (Modules/zipimport.c) 这个模块主要用于从 zip 文件中导入 Python 的模块.
  44. zlib (Modules/zlibmodule.c) 这个模块提供了 zip 压缩和解压功能, 基于 GNU zip 实现.
  45. _multibytecodec, _codecs_cn, _codecs_hk, _codecs_iso2022, _codecs_jp, _codecs_kr, _codecs_tw (Modules/cjkcodecs/*) 这些模块提供了 CJK(中日韩统一表意文字) 的编码和解码. 去掉这部分可以减小 python 解释器 600 多 K.
  46. marshal (Python/marshal.c) (http://docs.python.org/library/marshal.html) 为 Python 对象提供序列化的模块.
  47. imp (Python/import.c) (http://docs.python.org/library/imp.html) 这个模块提供了 Python 里的 import 语句的实现.
  48. main, builtin, sys, exceptions, _warnings 这部分模块在 config.c 设置里只是一个名字占位符.
  49. _io (Modules/_iomodule.c) (http://docs.python.org/library/io.html) 新版本的 Python 输入输出模块, 在 Python 3 中为默认的输入输出处理方法.

25.YAML

YAML 代表 『YAML Ain』t Markup Language』。它是一种数据格式语言,是 JSON 的超集。

与 JSON 不同,它可以存储更复杂的对象并引用自己的元素。你还可以编写注释,使其尤其适用于编写配置文件。

PyYAML 模块(https://pyyaml.org/wiki/PyYAMLDocumentation)可以让你在 Python 中使用 YAML。安装:

$ pip install pyyaml

  

然后导入到项目中:

import yaml

  

PyYAML 使你能够存储任何数据类型的 Python 对象,以及任何用户定义类别的实例。

 

26.zip

给你支最后一招,非常酷。还在用两个列表来组成一部词典吗?

keys = ['a', 'b', 'c']
vals = [1, 2, 3]
zipped = dict(zip(keys, vals))

  

zip() 内置函数使用多个可迭代对象作为输入并返回元组列表。每个元组按位置索引对输入对象的元素进行分组。

你也可以通过调用*zip() 来「解压」对象。

选自FreeCodeCamp

作者:Peter Gleeson

Python学习交流群:548377875

机器之心编译。

原文链接:https:// class="visible">medium.freecodecamp.org class="invisible">/an-a-z-of-useful-python-tricks-b467524ee747

someInstance = someClass()

配置

21.uuid

生成通用唯一标识符(Universally Unique ID,UUID)的一种快速简单方法就是使用 Python 标准库的 uuid 模块。

uuid 模块:https://docs.python.org/3/library/uuid.html

import uuid
user_id = uuid.uuid4()
print(user_id)

  

这创建了一个随机化后的 128 比特数字,该数字几乎必然是唯一的。

事实上,可以生成 2¹²²可能的 UUID。这个数字超过了 5,000,000,000,000,000,000,000,000,000,000,000,000。

在给定集合中找出重复数字的可能性极低。即使有一万亿 UUID,重复数字存在的概率也远远低于十亿分之一。

 

result += [result_row]

环境变量

目前还不清楚为何 export $PATH 后,运行 python 命令找不到 python lib 库,而且找不到 site 模块。而使用绝对路径访问 python 没有问题。

/tmp/bin # python
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
ImportError: No module named site

/tmp/bin # /tmp/bin/python
Python 2.7.11 (default, May 16 2016, 17:11:59) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

通过配置环境变量解决:

export PYTHONHOME=/usr/lib/python2.7
export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
export PATH=$PATH:$PYTHONHOME:$PYTHONPATH

14.newspaper3k

如果你之前没有见过它,那么我建议你先查看:https://pypi.org/project/newspaper3k/。

它可以帮助你从大量顶级国际出版物中检索到新闻文章和相关元数据。你可以检索图像、文本和作者名。

它还有一些内置的 NLP 功能。

地址:https://newspaper.readthedocs.io/en/latest/user_guide/quickstart.html#performing-nlp-on-an-article

如果你想在下一个项目中使用 BeautifulSoup 或其它 DIY 网页抓取库,那么不如使用$ pip install newspaper3k,既省时又省事,何乐而不为呢?

 

def addMatrix(a : Matrix, b : Matrix) -> Matrix:

问题

  • 易于学习
  • 超高的通用性
  • 具备大量模块和库

除非您正在开发自己的IDE,否则您可能最感兴趣的是将Jedi用作编辑器插件。幸运的是,已经可用了!

下载、解压 python 源代码

从 python.org 下载。

10.Jedi

Jedi 库是一个自动完成和代码分析的库。它使代码编写变得更快、效果更高。

除非你正在开发自己的 IDE,否则你肯定会对使用 Jedi 库作为编辑插件很感兴趣。

Jedi:https://jedi.readthedocs.io/en/latest/docs/usage.html

你可能已经在使用 Jedi 了。IPython 项目就使用 Jedi 实现代码自动完成功能。

永远不要改变,Python。从不改变。

编译

简单的 make 命令即可。

Python 是世界上最流行、热门的编程语言之一,原因很多,比如:

return "<some description here>"

configure 配置

配置命令如下:
configure 的 prefix 只支持绝对路径。

cd build-mips

../configure --host=mips64-octeon-linux-gnu --build=x86_64-linux-gnu --prefix=/home/sunyongfeng/python-install --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no ac_cv_have_long_long_format=yes PGEN_FOR_BUILD=../build-pc/Parse/pgen

问题:

  • --enable-FEATURE,不清楚有哪些 features ,怎么配置;
  • --enable-PACKAGE,不清楚有哪些 package,怎么配置。

配置完了之后,在 Modules 目录会生成 Setup 文件。x86 的默认编译会编译到必须的模块,而 mips64 的交叉编译很多模块没有编译下,如 socket 等。修改 Modules/Setup 文件,定制想编译的内置模块。以下是基础模块,目前还不清楚如果不想内置的话要如何编译。
定制内置模块,参见这篇博文 《定制 Python 嵌入 C++: (四) 定制 Python 内建模块》,讲述各个内置模块的功能。

# Modules that should always be present (non UNIX dependent):                                       

array arraymodule.c # array objects                                                                 
cmath cmathmodule.c _math.c # -lm # complex math library functions                                  
math mathmodule.c _math.c # -lm # math library functions, e.g. sin()                                
_struct _struct.c   # binary structure packing/unpacking                                            
time timemodule.c # -lm # time operations and variables                                             
operator operator.c # operator.add() and similar goodies                                            
_testcapi _testcapimodule.c    # Python C API test module                                           
_random _randommodule.c # Random number generator                                                   
_collections _collectionsmodule.c # Container types                                                 
_heapq _heapqmodule.c       # Heapq type                                                            
itertools itertoolsmodule.c # Functions creating iterators for efficient looping                    
strop stropmodule.c     # String manipulations                                                      
_functools _functoolsmodule.c   # Tools for working with functions and callable objects             
_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c  # elementtree accelerator
#_pickle _pickle.c  # pickle accelerator                                                            
datetime datetimemodule.c   # date/time type                                                        
_bisect _bisectmodule.c # Bisection algorithms                                                      

unicodedata unicodedata.c    # static Unicode character database

7.geopy

地理(Geography)对于程序员来说可能是一个具有挑战性的领域。但是 geopy 模块让它变得异常简单。

geopy 模块:https://geopy.readthedocs.io/en/latest/

$ pip install geopy

它通过抽取一系列不同地理编码服务的 API 来工作,使用户获取一个地方的完整街道地址、纬度、经度,甚至海拔高度。

另外一个有用的功能是距离:它可以用你喜欢的度量单位计算出两个位置之间的距离。

from geopy import GoogleV3
place = "221b Baker Street, London"
location = GoogleV3().geocode(place)
print(location.address)
print(location.location)

 

在Python中定义类或对象时,提供一种将该对象表示为字符串的“官方”方法很有用。例如:>>> file = open('file.txt', 'r')

附二:Python 最佳编译依赖

直接译自 Python Deployment。

键入如下命令自动安装一些依赖:

$ sudo apt-get build-dep python2.7

确认安装如下列下的其他 -dev 包。

  • python-dev
  • libncurses5-dev
  • libsqlite3-dev
  • libbz2-dev
  • libreadline-dev
  • libdb4.8-dev
  • tcl8.5-dev,tk8.5-dev

下面这个包在 ubuntu 早期版本(如 10.04)并没有自动安装,需确认一下。

  • libssl-dev
  • libexpat1-dev
  • libreadline6-dev
  • libgtk2.0-dev

如果想支持 xml 相关:

  • libxml2-dev
  • libxslt1-dev

如果想支持 MySQLdb (在 pypi 中实际命令为 MySQL-python):

  • libmysqlclient-dev

最终的 make 结果(编译结果)如能如下:

Python build finished, but the necessary bits to build these modules were not found:
_tkinter           bsddb185           dl
gdbm               imageop            sunaudiodev
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

这个编译 log 提示哪些模块没有被编译到,注意其中有一些并不是必需的或过时的:

  • bsddb185: Older version of Oracle Berkeley DB. Undocumented. Install version 4.8 instead.
  • dl: For 32-bit machines. Deprecated. Use ctypes instead.
  • imageop: For 32-bit machines. Deprecated. Use PIL instead.
  • sunaudiodev: For Sun hardware. Deprecated.
  • _tkinter: For tkinter graphy library, unnecessary if you don't develop tkinter programs.

20.类型提示(Type hints)

Python 是动态语言。在定义变量、函数、类别等时无需指定数据类型。

这有利于缩短开发周期。但是,简单的类型错误(typing issue)导致的运行时错误真的太烦了。

从 Python 3.5 版本开始,用户可以选择在定义函数时开启类型提示。

def addTwo(x : Int) -> Int:
    return x + 2

  

你还可以定义类型别名:

from typing import List
Vector = List[float]
Matrix = List[Vector]
def addMatrix(a : Matrix, b : Matrix) -> Matrix:
  result = []
  for i,row in enumerate(a):
    result_row =[]
    for j, col in enumerate(row):
      result_row += [a[i][j] + b[i][j]]
    result += [result_row]
  return result
x = [[1.0, 0.0], [0.0, 1.0]]
y = [[2.0, 1.0], [0.0, -2.0]]
z = addMatrix(x, y)

  

尽管非强制,但类型注释可以使代码更易理解。

它们还允许你在运行之前使用类型检查工具捕捉 TypeError。在进行大型复杂项目时执行此类操作是值得的。

 

def __init__(self, value):

编译本地 Python 与 pgen

用于生成 grammar 所需要文件用。

cd build-pc

../configure CC=gcc CXX=g++ AR=ar RANLIB=ranlib LDFLAGS="-L/usr/lib -L/usr/lib64 -L/usr/local/lib -L/usr/local/lib64" CFLAGS="-I/usr/include -I/usr/local/include"

make python Parser/pgen

本文将分享一些使用 Python 的技巧,顺序按照 A-Z 排列。

zip 压缩

参考文献

  • 定制 Python 嵌入 C++: (四) 定制 Python 内建模块
  • build python 2.7.11 for mips
  • Python Deployment
  • How to cross compile python for MIPS
  • python-2.7-001-support-for-build.patch

5.emoji

是的,真的有。请点击这里:https://pypi.org/project/emoji/

$ pip install emoji

 

别以为我不知道你会偷偷试它→→

from emoji import emojize
print(emojize(":thumbs_up:"))

本文由澳门新葡萄京娱乐网站发布于编程知识,转载请注明出处:这些Python代码技巧,交叉编译

关键词:

上一篇:没有了
下一篇:没有了