Python补充
内建函数
序列sequence
下面的内建函数(built-in function)**可用于序列(列表,元组,字符串)**:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| s = (1,2,3,4,False)
print(len(s))
print(min(s))
print(max(s))
print(all(s))
print(any(s))
print(s.count(2))
print(s.index(False))
|
由于元组的元素不可变更,下面方法只适用于列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| l2 = [1,2,3] l3 = ['a','b','c']
l2.extend(l3)
print(l2)
l2.append('na')
print(l2)
l2.sort()
print(l2)
l2.reverse()
print(l2)
poped = l2.pop()
print(poped) print(l2)
del l2[2]
print(l2)
|
字符串string
下面是一些用于字符串的方法。尽管字符串是定值表的特殊的一种,但字符串(string)类有一些方法是改变字符串的。这些方法的本质不是对原有字符串进行操作,而是建立一个新的字符串,所以并不与定值表的特点相矛盾。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| str = 'who is your daddy?' sub = 'o' width = 4
print(str.count(sub))
print(str.find(sub)) print(str.find('mom'))
print(str.index(sub))
print(str.rfind(sub)) print(str.rfind('mom'))
print(str.rindex(sub))
print(str.isalnum())
print(str.isalpha())
print(str.isdigit())
print(str.istitle())
print(str.isspace())
print(str.islower())
print(str.isupper())
print(str.split()) print(str.split(' ',2))
print(str.rsplit()) print(str.rsplit(' ',1))
seq = ('01','02','03') print(str.join(seq))
print(str.strip()) print(str.strip('?'))
print(str.replace(sub, 'naxx'))
print(str.capitalize())
print(str.lower())
print(str.upper())
print(str.swapcase())
print(str.title())
print(str.center(30))
print(str.ljust(30))
print(str.rjust(30))
|
Python小技巧
import模块
在Python经常使用import声明,以使用其他模块(也就是其它.py文件)中定义的对象。
使用__name__
当在运行本文件时, __name__的值为:’__main__‘, 引入文件中的__name__值为引入文件名
利用该特性, 可以保证一些测试语句在引入时不被执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def lib_func(a): return a + 10
def lib_func_another(a): return a + 20
if __name__ == '__main__': test = 101 print(lib_func(test))
print('__name__ = ', __name__)
import TestLib print(TestLib.lib_func(120))
|
更多import使用方式
import TestLib as test 引用TestLib模块,并将它改名为t
1 2
| import TestLib as test print(test.lib_func(120))
|
from TestLib import lib_func 只引用TestLib中的lib_func对象,并在使用时跳过TestLib引用字段
1 2
| from TestLib import lib_func print(lib_func(120))
|
from TestLib import * 引用所有TestLib中的对象,并在使用时跳过TestLib引用字段
1 2
| from TestLib import * print(lib_func(120))
|
查询
查询函数的参数
当我们想要知道某个函数会接收哪些参数的时候,可以使用inspect查询。
1 2 3 4 5 6 7
| def lib_func(a,b=0): return a + b
import inspect print(inspect.signature(lib_func)) print(inspect.getfullargspec(lib_func))
|
查询对象的属性
除了使用dir()来查询对象的属性之外,我们可以使用内置函数hasattr()来确认一个对象是否具有某个属性:
1
| print(hasattr(list,'count'))
|
查询对象所属的类和类名称
1 2 3
| a = [1,2,2,3] print(a.__class__) print(a.__class__.__name__)
|
查询父类
我们可以用 __base__ 属性来查询某个类的父类:
使用中文(以及其它非ASCII编码)
在Python程序的第一行加入#coding=utf8 或者 # -*- coding: UTF-8 -*-,例如:
1 2 3 4
| print('你好!')
print('你好!')
|
表示2进制,8进制和16进制数字
1 2 3 4 5 6 7 8
| print(0b10)
print(0o10)
print(0x10)
|
注释
一行内的注释可以以#开始。
多行的注释可以以'''开始,以'''结束,比如:
1 2 3 4 5 6 7 8 9 10
| ''' This is demo '''
def func(): print("Hello world!")
func()
|
搜索路径
当import的时候,Python会在搜索路径中查找模块(module)
可以在Python运行的时候增加或者删除sys.path中的元素。
另一方面,可以通过在shell中增加PYTHONPATH环境变量,来为Python增加搜索路径。
1 2
| import sys print(sys.path)
|
1 2 3
| # 增加/home/vamei/mylib到搜索路径中: # 若添加到~/.bashrc中, 将长期改变搜索路径 $ export PYTHONPATH=$PYTHONPATH:/home/vamei/mylib
|
脚本与命令行结合
可以使用下面方法运行一个Python脚本,在脚本运行结束后,直接进入Python命令行。
这样做的好处是脚本的对象不会被清空,可以通过命令行直接调用。
安装非标准包
使用Linux repository (Linux环境)
使用pip. pip是Python自带的包管理程序
1 2 3
| $ pip install -i [网络路径] [本地包名] $ pip uninstall web.py $ pip install -i [网络路径] --upgrade [本地包名]
|
如果Python安装在一个非标准的路径(使用$which python来确认python可执行文件的路径)中,比如/home/vamei/util/python/bin中,你可以使用下面方法设置pip的安装包的路径:
1
| $ pip install -i http://mirrors.aliyuncs.com/pypi/simple --install-option="--prefix=/home/vamei/util/" web.py
|
从源码编译
Python内置函数清单
数学运算
1 2 3 4 5 6 7 8 9
| print(abs(-5)) print(round(2.4)) print(pow(2,3)) print(pow(2,3,5)) print(divmod(9,2)) print(max([1,3,6,2,9])) print(min([1,3,6,2,9])) print(sum([2,-1,9,12]))
|
类型转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| print(int('5')) print(float(2)) print(str(2.3)) print(type(str(2.3))) print(complex(3,9)) print(type(complex(3,9))) print(ord('A')) print(chr(65)) print(bool(0)) print(bin(56)) print(oct(56)) print(hex(56)) print(list((1,2,3,4))) print(tuple([1,2,3,4])) print(dict(a=1,b='hello',c=[1,2,3]))
|
序列操作
1 2 3 4 5
| print(all([True,1,'hello'])) print(any(['',0,False,[],None])) print(sorted([1,4,2,3,6])) print(list(reversed([1,3,6,4,2])))
|
类、对象、属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Me(object): def test(self): print('hello') def new_test(): print('new hello') me = Me()
print(hasattr(me,'test')) test = getattr(me,'test') test() setattr(me,'test',new_test) me.test() delattr(me,"test") print(isinstance(me,Me)) print(issubclass(Me,object)) print(repr(me))
|
编译、执行
1 2 3 4 5 6
| c = compile("print('hello')",'test.py','exec') print(c) exec(c) exec("print('hel')") eval(c) eval("print('hel')")
|
其他
1 2 3 4
| input = input('Please input:') print(input) print(globals()) print(locals())
|
字符串格式化(%操作符)
Python中内置有对字符串进行格式化的操作%。
模板
格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个值传递给模板,每个值对应一个格式符。
在模板和tuple之间,有一个%号分隔,它代表了格式化操作
1
| print("I'm %s. I'm %d years old" % ('ni9ne',99))
|
还可以用词典来传递真实值,命名使用()括起来。每个命名对应词典的一个key。
1
| print("I'm %(name)s. I'm %(age)d years old" % {'name':'ni9ne','age':99})
|
格式符
格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| %s 字符串 (采用str()的显示) %r 字符串 (采用repr()的显示) %c 单个字符 %b 二进制整数 %d 十进制整数 %i 十进制整数 %o 八进制整数 %x 十六进制整数 %e 指数 (基底写为e) %E 指数 (基底写为E) %f 浮点数 %F 浮点数,与上相同 %g 指数(e)或浮点数 (根据显示长度) %G 指数(E)或浮点数 (根据显示长度)
%% 字符"%"
|
格式进行进一步的控制:
1 2 3 4 5 6 7
| %[(name)][flags][width].[precision]typecode
print("%+10s" % 10) print("%04d" % 5) print("%7.3f" % 2.3) print("%+7.3f" % 2.3) print("%.*f" % (4, 1.2))
|
1 2 3 4 5 6 7 8 9
| (name)为命名 flags可以有+,-,' '或0。 +表示右对齐。 -表示左对齐。 ' '为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。 0表示使用0填充。 width表示显示宽度 precision表示小数点后精度 width, precision为两个整数。可以利用*,来动态代入这两个量。
|
其他方式
Python3.6新增加了格式化字符串字面值的特性,可以方便的格式化字符串。
1 2 3
| name = 'ni9ne' age = 99 print(f'我叫{name},今年{age}岁')
|
1 2
| print('我叫{},今年{}岁'.format('ni9ne','99')) print('我叫{name},今年{age}岁'.format(name='ni9ne',age='99'))
|