函数基础
一 函数基础
def func(a): #使用def关键字定义函数,a为形参 ''' 函数文档 '''
pass #函数体 return a #返回值 func('A') #函数调用,A为实参
1. 函数文档
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
文档的贯例是多行字符串,第一行以大写字母开头以句点(.)结束,第二行是空行,从第三行开始是详细描述。强烈建议,为你重要的函数写文档字符串要遵循此贯例。
def title(self, *args, **kwargs): # real signature unknown """ 函数的作用 param args:xxxx param kwargs:xxxx
return:xxxx """ pass
2. 返回值
2.1 遇到return,函数结束,return下面的(函数内)的代码不会执行。
2.2 return 会给函数的执行者返回值
- 如果return后面什么都不写,或者函数中没有return,则返回的结果是None
- 如果return后面写了一个值,返回给调用者这个值
- 如果return后面写了多个结果,返回给调用者一个tuple(元组),调用者可以直接使用元组的解构获取多个变量
- 可以返回表达式,如 return a+b
def func(a, b): #(位置参数、默认参数、动态参数) a.strip() return a, b ret = func('A', 'B') #(位置参数、关键词参数) print(ret) ('A', 'B')
3. 函数的嵌套
函数内部再次定义函数
def func_1(): def func_2(): print('func_2') func_2() print('func_1') func_1()
注意嵌套函数与内存的交互原理
NMAE = "yangtuo is good" # 1 def yangtuo(): # 2 将整个函数放入内存编译,但是不执行 name = "yangtuo" # print(name) # def yang(): # 3 将整个函数放入内存编译,但是不执行 name = "yang" # print(name) # def tuo(): # 4 将整个函数放入内存编译,但是不执行 name = "tuo" # print(name) # tuo() # 4.1 执行函数tuo,得出结果 tuo print(name) # 5 调取yang的name,得出结果 yang yang() # 3.1 执行函数yang,得出结果 yang print(name) # 6 调取yangtuo的name,得出结果yangtuo yangtuo() # 2.1 执行函数yangtuo,得出结果 yangtuo
二 参数
1. 形参、实参,位置、默认、关键字参数
形参:写在函数声明的位置的变量 ,包含位置参数,默认值参数,动态参数,混合参数;
实参:在函数调用时候给函数传递的值 ,包含位置参数,关键字参数,混合参数;
形参中,默认参数一定在位置参数之后
实参中,关键词参数一定在位置参数之后
关键字参数的用法就是 参数变量名=参数值。变量名不需要引号。
def func(a, b, c,d='D'): #先声明位置参数,再声明默认值参数 print(a);print(b);print(c);print(d) func('A', c='C', b='B') #先传递位置参数,再传递关键字参数
A;B;C;D
2. 动态参数
2.1 动态接受位置参数 *args,*表示把接收到的数据打包成一个元组
(1)动态参数应在位置参数之后
#正确的写法,动态参数在位置参数之后
def chi(a, b, *food): print("我要吃", food, a, b) #推荐 chi("大米饭", "小米饭", "黄瓜", "茄子")
#错误写法,会报错,动态参数在位置参数之前 def chi(*food,a, b): print("我要吃", food, a, b) #报错 chi("大米饭", "小米饭", "黄瓜", "茄子")
#不报错,但不提倡,实参中采用关键词引导 def chi(*food, a, b): #不推荐 print("我要吃", food, a, b) chi("大米饭", "小米饭", a="黄瓜", b="茄子") # 必须⽤关键字参数来指定
(2)动态参数应在默认值之前
#动态参数在默认值之前,状况百出
def chi(a, b, c ='小笼包',*food): print(a,b,c,food) chi("大米饭", "小米饭",) chi("大米饭", "小米饭", "黄瓜") chi("大米饭", "小米饭", "黄瓜", "茄子") 大米饭 小米饭 小笼包 () #默认值 生效 大米饭 小米饭 黄瓜 () #不生效 大米饭 小米饭 黄瓜 ('茄子',) #不生效
#动态参数放在默认值之后,正确
def chi(a, b, *food, c='小笼包'):
print(a, b, c, food)
chi("大米饭", "小米饭", )
chi("大米饭", "小米饭", "黄瓜")
chi("大米饭", "小米饭", "黄瓜", "茄子")
大米饭 小米饭 小笼包 () #生效
大米饭 小米饭 小笼包 ('黄瓜',) #生效
大米饭 小米饭 小笼包 ('黄瓜', '茄子') #生效
2.2 动态接受关键字参数 **kwargs,**表示把接收到的数据当成一个字典
关键字参数的用法就是 参数变量名=参数值。变量名不需要引号。变量名与字典中的key值不是一样的。
def func(**kwargs): print(kwargs) func(a='1',b='2',c='3') #kwargs的传参其实就是赋值语句
{'a': '1', 'b': '2', 'c': '3'}
3. 形参顺序
位置参数 》*args 》默认参数 》**kwargs
def func(a, b, *args, e='E', **kwargs): print(a, b, args, e, kwargs) func('A', 'B', 'C', 'D', f='F', g='G') A B ('C', 'D') E {'f': 'F', 'g': 'G'}
接受所有参数一般用(推荐)
def func(*args, **kwargs): print(args,kwargs) func('A', 'B', 'C', 'D', f='F', g='G') ('A', 'B', 'C', 'D') {'f': 'F', 'g': 'G'}
4. 动态参数的聚合和打散
* 的含义:
- 在函数定义阶段(形参):聚合
- 在函数执行阶段(实参):打散
聚合、打散的参数都是可迭代对象:列表、字符串、字典等
def func(*args, **kwargs): #聚合:形参中的*为把接收到的数据组合成 元组 或者 字典 print(args,kwargs) var = ['a', 'b', 'c'] var2 = {'a': 'A', 'b': 'B'} var3 = {'c':'C','d':'D'} func(*var,**var2,**var3) # 打散:实参中的* 为把数据拆分成 单个元素 或者 键值对
在函数中打散args,注意下例中两者区别
def func(*args,**kwargs): print(*args) #1 2 3 4 # print(args) #(1,2,3,4) func(1,2,3,4)
在函数中打散kwargs
def func(*args, **kwargs): print(*kwargs) # a b ,不理解具体过程 # print(**kwargs) #报错:'a' is an invalid keyword argument for print(),这是因为print()函数中只有(*args) func(a='1',b='2')
5. 命名空间
5.1 定义
命名空间是名称到对象的映射,是一个 字典 ,它的键就是变量名,它的值就是那些变量的值。
A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。
python程序执行期间会有2个或3个活动的命名空间(函数调用时有3个,函数调用结束后2个)。按照变量定义的位置,可以划分为以下3类:
- Local, 局部命名空间,每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。
- Global,全局命名空间,每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。
- Built-in,自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常。
5.2 命名空间查找顺序
注意:不同命名空间中命名没有任何联系
5.3 生命周期
Local(局部命名空间)在函数被调用时才被创建,但函数返回结果或抛出异常时被删除。(每一个递归函数都拥有自己的命名空间)。
Global(全局命名空间)在模块被加载时创建,通常一直保留直到python解释器退出。
Built-in(内建命名空间)在python解释器启动时创建,一直保留直到解释器退出。
各命名空间创建顺序:python解释器启动 ->创建内建命名空间 -> 加载模块 -> 创建全局命名空间 ->函数被调用 ->创建局部命名空间
各命名空间销毁顺序:函数调用结束 -> 销毁函数对应的局部命名空间 -> python虚拟机(解释器)退出 ->销毁全局命名空间 ->销毁内建命名空间
python解释器加载阶段会创建出内建命名空间、模块的全局命名空间,局部命名空间是在运行阶段函数被调用时动态创建出来的,函数调用结束动态的销毁的。
5.4 查看命名空间
1、局部命名空间可以 locals() 来访问。
def func1(i, str): x = 12345 print(locals()) func1(1, "first") {'i': 1, 'str': 'first', 'x': 12345}
2、全局 (模块级别)命名空间可以通过 globals() 来访问。
import copy from copy import deepcopy gstr = "global string" def func1(i, info): x = 12345 print(locals()) func1(1, "first") if __name__ == "__main__": dictionary = globals() print(dictionary)
结果为:
{'__name__': '__main__','__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000001B1CF8>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': 'E:\2019allstark\practice1\1\001.py', '__cached__': None,
'copy': <module 'copy' from 'C:\Users\matt\AppData\Local\Programs\Python\Python37\lib\copy.py'>,
'deepcopy': <function deepcopy at 0x00000000027C16A8>, 'gstr': 'global string',
'func1': <function func1 at 0x00000000003EC1E0>, 'dictionary': {...}}
上例可看出 import moudle 和 from moudle import function 的区别,前者还是导入的模块,后者完全为在此文件中重新定义的函数。
3、locals()和globals()都要放在最后执行。变量生成是按照执行顺序执行的
def func(): print(locals()) i = 1 print(globals()) def func1(): pass func()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000401CF8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/2019allstark/practice1/1/002.py', '__cached__': None, 'func': <function func at 0x000000000043C1E0>}
{} #都缺少相应的变量
6. 作用域
6.1 定义
作用域是针对命名空间而言,指命名空间在程序里的可应用范围,或者说是Python程序(文本)的某一段或某几段,在这些地方,某个命名空间中的名字可以被直接引用。这部分程序就是这个命名空间的作用域。只有函数(lambda、生成器表达式、列表解析式也是函数)、类、模块会产生新的作用域,代码块(例如if、for代码块)不会产生新的作用域。另外,python中变量的作用域是由它在源代码中的位置决定的。由一个赋值语句引进的名字在这个赋值语句所在的作用域里是可见(起作用)的,而且在其内部嵌套的每个作用域内也可见,除非它被嵌套于内部的且引进同样名字的赋值语句所遮蔽。
6.2 查找顺序
上述作用域的定义中表名了命名空间与作用于之间的关系:作用于是命名空间的可见范围。那么,在程序中访问某个名称时,是怎样一个搜索顺序呢?按照LEGB顺序搜索:
Local:首先搜索,包含局部名字的最内层(innermost)作用域,如函数/方法/类的内部局部作用域;
Enclosing:根据嵌套层次从内到外搜索,包含非局部(nonlocal)非全局(nonglobal)名字的任意封闭函数的作用域。如两个嵌套的函数,内层函数的作用域是局部作用域,外层函数作用域就是内层函数的 Enclosing作用域;
Global:倒数第二次被搜索,包含当前模块全局名字的作用域;
Built-in:最后被搜索,包含内建名字的最外层作用域。
Python按照以上LEGB的顺序依次在四个作用域搜索名字,没有搜索到时,Python抛出NameError异常。所以:
在局部作用域中,可以看到局部作用域、嵌套作用域、全局作用域、内建作用域中所有定义的变量。
在全局作用域中,可以看到全局作用域、内建作用域中的所有定义的变量,无法看到局部作用域中的变量。
在Python中,类定义所引入的作用域对于成员函数是不可见的,这与C++或者Java是很不同的,因此在Python中,成员函数想要引用类体定义的变量,必须通过self或者类名来引用它。(我的理解是Python类中所有变量有一个作用域,每个成员函数都有各自都作用域,这些作用域都是Local,且是平级的*)
6.3 global、nonlocal关键字
global表示使用全局中的变量。
nonlocal表示使用父级命名空间的变量,不局限于上一级父空间,或者更外层作用域非全局作用域。
i = 1 def func(): global i #如果没有本句,会报错,UnboundLocalError: local variable 'i' referenced before assignment print(i) #输出1 i = 2 func() print(i) #输出2
关键字nonlocal的作用与关键字global类似,使用nonlocal关键字可以在一个嵌套的函数中修改嵌套作用域中的变量,示例如下:
def f1(): i = 1 def f2(): nonlocal i print(i) #输出1 i = 2 f2() print(i) f1() #输出2
多级嵌套下的nonlocal:不局限于一级父空间
a = 1 def fun_1(): a = 2 def fun_2(): # a = 3 def fun_3(): nonlocal a a = 4 print(a) print(a) fun_3() print(a) print(a) fun_2() print(a) print(a) fun_1() print(a)
1;2;2;4;4;4;1
注意:解释器运行流程
i = 1 def func(): print(i) i = 2 func()
报错,UnboundLocalError: local variable 'i' referenced before assignment
Python解释器执行到print(i),此时 i 在局部作用域没有定义。解释器尝试继续执行,后面定义了 i,解释器就认为代码在定义之前就是用了名字,所以抛出了这个异常。如果解释器解释完整个函数都没有找到名字i,那就会沿着搜索链LEGB往上找了,最后找不到抛出NameError异常。
当在一个函数内部为一个变量赋值时,并不是按照上面所说LEGB规则来首先找到变量,之后为该变量赋值。在Python中规则如下:“当在函数中给一个变量名赋值是(而不是在一个表达式中对其进行引用),Python总是创建或改变本地作用域的变量名,除非它已经在那个函数中被声明为全局变量. ”
7. 作用域易错实例
7.1 函数的命名空间在函数被调用时创建,函数执行完毕,命名就也被销毁
def test(): i = 0 test() print(i)
7.2 if条件判断语句不会引入新的作用域
if True: i = 1 print(i) # 可以正常输出i的值1,不会报错
7.3 for循环不会引入新的作用域
for i in range(10): pass print(i) #输出结果是9
7.4 lambda、生成器表达式、列表解析式也是函数,都会引入新作用域
list_1 = [i for i in range(5)] print(i) #报错,name 'i' is not defined
7.5 在函数内部进行模块导入时,导入的模块只在函数内部作用域生效
def import_sys(): import sys import_sys() print(sys.path) # 报错:NameError: name 'sys' is not defined
7.6 函数的命名空间是在函数被调用时创建的
def test(): print(i)# 可正常输出0 i = 0 test()
def test(): print(i) i= 2 i = 0 test() #报错
def test(): i = [2 , 2] i = [1 , 2] test() print(i) 输出结果:[1 , 2]
def test(): #很难理清思路 i[0] = 2 i = [1 , 2] test() print(i) 输出结果:[2, 2]
list作为一个可变对象,i[0] = 2并不是对名字l的重绑定,而是对l的第一个元素的重绑定,所以没有新的名字被定义。因此在函数中成功更新了全局作用于中l所引用对象的值。
7.7 函数的作用域由函数声明的位置决定,与调用函数的位置无关
i = 1 def f1(): print(i) def f2(): i = 2 f1() f2() print(i) # 1;1
i = 1 def f1(): print(i) def f2(): i = 2 return f1 ret = f2() ret() print(i) #1;1
i = 1 def f1(): i = 2 def f2(): print(i) return f2 func = f1() func() print(i) #2;1
对比上述3例可知,函数的作用域是静态的,由函数声明的位置决定,在哪里声明,就决定了它的上层作用域是谁,这与调用函数的位置无关。无论在哪里调用,它都会去函数本身的作用域中的命名空间找,找不到在去上一层的命名空间找,切记未必是在调用该函数的作用域的命名空间找。
7.8 Python类成员变量与成员函数都有自己的作用域,且各作用域平级
class A(object): a = 2 def fun(self): print(a) new_class = A() new_class.fun() #报错:NameError: name 'a' is not defined
参考:
命名空间与作用域详解:
https://www.cnblogs.com/chenhuabin/p/10123009.html
https://www.jb51.net/article/114951.htm
8. 可变、不可变对象传参
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
python 函数的参数传递:
-
不可变类型:如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
-
可变类型:如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
8.1 不可变对象实例
1 def ChangeInt(a): 2 a = 10 3 b = 2 4 ChangeInt(b) 5 print(b) # 2
实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。
8.2 可变对象实例,函数实现对全局变量的修改
def changeme(mylist): mylist.append([1, 2, 3, 4]) print("函数内取值: ", mylist) mylist = [10, 20, 30] changeme(mylist) print("函数外取值: ", mylist)
函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]
区别:上例为在可变对象自身id的基础上进行的修改,下例为更改id,生成新的链接
def changeme(mylist): mylist=[1, 2, 3, 4] print("函数内取值: ", mylist) mylist = [10, 20, 30] changeme(mylist) print("函数外取值: ", mylist)
函数内取值: [1, 2, 3, 4]
函数外取值: [10, 20, 30]
9. 可变默认参数实坑
可变默认参数只会生成一次
li = [1,2] def func(a, b=li): b.append(a) print(b) # return b ret = func(3) ret = func(4) def func(a, b=[1,2]):#默认参数的传递:同上例一致 b.append(a) print(b) # return b ret = func(3) ret = func(4) [1, 2, 3] [1, 2, 3, 4]
三 内置函数
以下是Python3版本所有的内置函数:共68个
1.、abs() 获取绝对值
2. all() 接受一个迭代器,如果迭代器的所有元素都为真,那么返回True,否则返回False
1 >>> tmp_1 = ['python',123] 2 >>> all(tmp_1) 3 True 4 >>> tmp_2 = [] 5 >>> all(tmp_2) 6 True 7 >>> tmp_3 = [0] 8 >>> all(tmp_3) 9 False
3. any() 接受一个迭代器,如果迭代器里有一个元素为真,那么返回True,否则返回False
4. ascii() 调用对象的__repr__()方法,获得该方法的返回值.
5. bin(), 6. oct(), 7. hex() 三个函数功能为:将十进制数分别转换为2/8/16进制。
8. bool() 测试一个对象是True还是False.
9. bytes() 将一个字符串转换成字节类型
1 >>> s = 'python' 2 >>> x = bytes(s, encoding='utf-8') 3 >>> x 4 b'python' 5 >>> a = '王' 6 >>> s = bytes(a, encoding='utf-8') 7 >>> s 8 b'xe7x8ex8b'
10. str() 将字符类型/数值类型等转换为字符串类型
1 >>> str(b'xe7x8ex8b', encoding='utf-8') # 字节转换为字符串 2 '王' 3 >>> str(1) # 整数转换为字符串 4 '1'
11. challable() 判断对象是否可以被调用,能被调用的对象就是一个callables对象,比如函数和带有__call__()的实例
1 >>> callable(max) 2 True 3 >>> callable([1, 2, 3]) 4 False 5 >>> callable(None) 6 False 7 >>> callable('str') 8 False
12. char(),13. ord() 查看十进制数对应的ASCII字符/查看某个ASCII对应的十进制数
>>> chr(65)
'A'
>>> ord('A')
65
14. classmethod() 用来指定一个方法为类的方法,由类直接调用执行,只有一个cls参数,执行雷的方法时,自动将调用该方法的类赋值给cls.没有此参数指定的类的方法为实例方法
1 class Province: 2 country = "中国" 3 4 def __init__(self, name): 5 self.name = name 6 7 @classmethod 8 def show(cls): # 类方法,由类调用,最少要有一个参数cls,调用的时候这个参数不用传值,自动将类名赋值给cls 9 print(cls) 10 11 # 调用方法 12 Province.show()
15. complie() 将字符串编译成python能识别或可以执行的代码,也可以将文字读成字符串再编译
1 compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) 2 将source编译为代码或者AST对象。代码对象能过通过exec语句来执行或者eval()进行求值。 3 参数source:字符串或者AST(abstract syntax trees)对象。 4 参数filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。 5 参数model:指定编译代码的种类。可以指定'exec', 'eval', 'single'。 6 参数flag和dont_inherit:这两个参数为可选参数。
1 >>> s = "print('helloworld')" 2 >>> r = compile(s, "<string>", "exec") 3 >>> r 4 <code object <module> at 0x000001C648038390, file "<string>", line 1>
16. complex()
1 创建一个值为real + imag * j的复数或者转化一个字符串或数为复数。如果第一个参数是字符串,则不需要指定第二个参数。 2 参数real:int,long,float或字符串。 3 参数imag:int,long,float。
17. delattr() 删除对象的属性
18. dict() 创建数据字典
1 >>> a = dict() 空字典 2 >>> a 3 {} 4 >>> b = dict(one = 1, two =2) 5 >>> b 6 {'one': 1, 'two': 2} 7 >>> c = dict({'one':1 ,'two':2}) 8 >>> c 9 {'one': 1, 'two': 2}
19. dir() 不带参数时返回当前范围内的变量,方法和定义的类型列表,带参数时返回参数的属性,方法列表
1 >>> dir() 2 ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'li', 'li1', 'li2', 'li_1'] 3 >>> dir(list) 4 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
20. divmod() 分别取商和余数
1 >>> divmod(20,6) 2 (3, 2)
21. enumerate() 返回一个可以枚举的对象,该对象的next()方法将返回一个元组
1 >>> test = ['a', 'b', 'c'] 2 >>> for k,v in enumerate(test): 3 print(k,v) 4 5 # 输出结果: 6 0 a 7 1 b 8 2 c
22. eval() 将字符串str当成有效的表达式来求值并返回计算结果
1 >>> s = "1+2*3" 2 >>> type(s) 3 <class 'str'> 4 >>> eval(s) 5 7
23. exec() 执行字符串或complie方法编译过的字符串,没有返回值
24. filter() 过滤器,构造一个序列,等价于[ item for item in iterables if function(item)],在函数中设定过滤条件,逐一循环迭代器中的元素,将返回值为True时的元素留下,形成一个filter类型数据
1 filter(function, iterable) 2 参数function:返回值为True或False的函数,可以为None。 3 参数iterable:序列或可迭代对象。 4 >>> def bigerthan5(x): 5 ... return x > 5 6 >>> filter(bigerthan5, [3, 4, 5, 6, 7, 8]) 7 [6, 7, 8]
25. float() 讲一个字符串或整数转换为浮点数
1 >>> float() 2 0.0 3 >>> float('123') 4 123.0 5 >>> float(1) 6 1.0 7 >>> float('a') 8 Traceback (most recent call last): 9 File "<pyshell#45>", line 1, in <module> 10 float('a') 11 ValueError: could not convert string to float: 'a'
26. format() 格式化输出字符串,format(value, format_spec)实质上是调用了value的__format__(format_spec)方法
1 >>> "I am {0}, I like {1}!".format("wang", "moon") 2 'I am wang, I like moon!'
27. frozenset() 创建一个不可修改的集合
1 frozenset([iterable]) 2 set和frozenset最本质的区别是前者是可变的,后者是不可变的。当集合对象会被改变时(例如删除,添加元素),只能使用set, 3 一般来说使用fronzet的地方都可以使用set。 4 参数iterable:可迭代对象。
28. getattr() 获取对象的属性
1 getattr(object, name [, defalut]) 2 获取对象object名为name的特性,如果object不包含名为name的特性,将会抛出AttributeError异常;如果不包含名为name的特性 3 且提供default参数,将返回default。 4 参数object:对象 5 参数name:对象的特性名 6 参数default:缺省返回值 7 >>> append = getattr(list, 'append') 8 >>> append 9 <method 'append' of 'list' objects> 10 >>> mylist = [3, 4, 5] 11 >>> append(mylist, 6) 12 >>> mylist 13 [3, 4, 5, 6] 14 >>> method = getattr(list, 'add') 15 Traceback (most recent call last): 16 File "<stdin>", line 1, in <module> 17 AttributeError: type object 'list' has no attribute 'add' 18 >>> method = getattr(list, 'add', 'NoMethod') 19 >>> method 20 'NoMethod'
29. globals() 返回一个描述当前全局变量的字典
1 >>> a = 1 2 >>> globals() 3 {'__loader__': <class '_frozen_importlib.BuiltinImporter'>, 'a': 1, '__builtins__': <module 'builtins' (built-in)>, '__doc__': None, '__name__': '__main__', '__package__': None, '__spec__': None}
30. hasattr()
1 hasattr(object,name) 2 判断对象object是否包含名为name的特性(hasattr是通过调用getattr(object,name))是否抛出异常来实现的。 3 参数object:对象 4 参数name:特性名称 5 >>> hasattr(list, 'append') 6 True 7 >>> hasattr(list, 'add') 8 False
31. hash() 哈希值
1 hash(object) 2 如果对象object为哈希表类型,返回对象object的哈希值。哈希值为整数,在字典查找中,哈希值用于快递比价字典的键。 3 两个数值如果相等,则哈希值也相等。
32. help() 返回对象的帮助文档
33. id() 返回对象的内存地址
1 >>> a = 1 2 >>> id(a) 3 1588522800
34. input() 获取用户输入内容
1 num = input("请输入一个数字:") 2 # 用户输入3 3 print(num) 4 # 输出结果 5 3
35. int() 将一个字符串或数值转换为一个普通整数
1 int([x[,radix]]) 2 如果参数是字符串,那么它可能包含符号和小数点。参数radix表示转换的基数(默认是10进制)。 3 它可以是[2,36]范围内的值,或者0。如果是0,系统将根据字符串内容来解析。 4 如果提供了参数radix,但参数x并不是一个字符串,将抛出TypeError异常; 5 否则,参数x必须是数值(普通整数,长整数,浮点数)。通过舍去小数点来转换浮点数。 6 如果超出了普通整数的表示范围,一个长整数被返回。 7 如果没有提供参数,函数返回0。
36、 isinstance( obj, cls ) 检查 对象obj 是否是 类cls 的对象,返回True或False
#两种判断方法:isinstance(),type()
class A:pass class B(A):pass b = B() print(isinstance(b,B)); print(isinstance(b,A)) #包含了所有的继承关系 print(type(b) is B); print(type(b) is A) #type(b):A, 所以后者False,可认为不包含继承关系
True; True; True; False
37、 issubclass( sub, super ) 检查一个类是否是另一个类的子类。返回True或False
class A:pass class B(A):pass print(issubclass(B,A)) #True print(issubclass(A,B)) #Fales
38. iter()
1 iter(o[, sentinel]) 2 返回一个iterator对象。该函数对于第一个参数的解析依赖于第二个参数。 3 如果没有提供第二个参数,参数o必须是一个集合对象,支持遍历功能(__iter__()方法)或支持序列功能(__getitem__()方法), 4 参数为整数,从零开始。如果不支持这两种功能,将处罚TypeError异常。 5 如果提供了第二个参数,参数o必须是一个可调用对象。在这种情况下创建一个iterator对象,每次调用iterator的next()方法来无 6 参数的调用o,如果返回值等于参数sentinel,触发StopIteration异常,否则将返回该值。
39. len() 返回对象长度,参数可以是序列类型(字符串,元组或列表)或映射类型(如字典)
40. list() 列表构造函数
1 list([iterable]) 2 list的构造函数。参数iterable是可选的,它可以是序列,支持编译的容器对象,或iterator对象。 3 该函数创建一个元素值,顺序与参数iterable一致的列表。如果参数iterable是一个列表,将创建 4 列表的一个拷贝并返回,就像语句iterables[:]。
41. locals() 打印当前可用的局部变量的字典
1 不要修改locals()返回的字典中的内容;改变可能不会影响解析器对局部变量的使用。 2 在函数体内调用locals(),返回的是自由变量。修改自由变量不会影响解析器对变量的使用。 3 不能在类区域内返回自由变量。
42. map()
1 map(function, iterable,...) 2 对于参数iterable中的每个元素都应用fuction函数,并将结果作为列表返回。 3 如果有多个iterable参数,那么fuction函数必须接收多个参数,这些iterable中相同索引处的元素将并行的作为function函数的参数。 4 如果一个iterable中元素的个数比其他少,那么将用None来扩展改iterable使元素个数一致。 5 如果有多个iterable且function为None,map()将返回由元组组成的列表,每个元组包含所有iterable中对应索引处值。 6 参数iterable必须是一个序列或任何可遍历对象,函数返回的往往是一个列表(list)。 7 8 li = [1,2,3] 9 data = map(lambda x :x*100,li) 10 print(type(data)) 11 data = list(data) 12 print(data) 13 14 运行结果: 15 16 <class 'map'> 17 [100, 200, 300]
43. max() 返回给定元素里最大值
1 max(iterable [,args...][, key]) 2 如果只提供iterable参数,函数返回可遍历对象(如:字符串,元组或列表)中最大的非空元素。 3 如果提供多个参数,那么返回值最大的那个参数。 4 可选参数key是单参数的排序函数。 5 如果提供key参数,必须是以命名的形式,如:max(a, b, c, key = fun)
44. meoryview()
45. min() 返回给定元素里最小值
1 min(iterable [,args...][, key]) 2 如果只提供iterable参数,函数返回可遍历对象(如:字符串,元组或列表)中最小的非空元素。 3 如果提供多个参数,那么返回值最小的那个参数。 4 可选参数key是单参数的排序函数。 5 如果提供key参数,必须是以命名的形式,如:max(a, b, c, key = fun)
46. next() 返回一个可迭代数据结构(如列表)中的下一项
47. object()
1 获取一个新的,无特性(geatureless)对象。Object是所有类的基类。它提供的方法将在所有的类型实例中共享。 2 该函数时2.2.版本新增,2.3版本之后,该函数不接受任何参数。
48. open() 打开文件
1 open(filename [, mode [, bufsize]]) 2 打开一个文件,返回一个file对象。 如果文件无法打开,将处罚IOError异常。 3 应该使用open()来代替直接使用file类型的构造函数打开文件。 4 参数filename表示将要被打开的文件的路径字符串; 5 参数mode表示打开的模式,最常用的模式有:'r'表示读文本,'w'表示写文本文件,'a'表示在文件中追加。 6 Mode的默认值是'r'。 7 当操作的是二进制文件时,只要在模式值上添加'b'。这样提高了程序的可移植性。 8 可选参数bufsize定义了文件缓冲区的大小。0表示不缓冲;1表示行缓冲;任何其他正数表示使用该大小的缓冲区; 9 负数表示使用系统默认缓冲区大小,对于tty设备它往往是行缓冲,而对于其他文件往往完全缓冲。如果参数值被省却。 10 使用系统默认值。
49. pow() 幂函数
1 r = pow(2, 10) # 2的10次方 2 print(r) 3 4 # 输出 5 1024
50. print() 输出函数
1 python2中的print语句被python3中的print()函数取代。 2 如何限制print的默认换行: 3 1. python2版本下,在print输出的最后加一个逗号',' 4 2. python3.4以后,print(value, ...,sep='',end=' ',file=sys.stdout,flush=False),将end设为空即可。
51. property()
52. range() 根据需要生成一个指定范围的数字,可以提供你需要的控制来迭代指定的次数
1 用于创建包含连续算术值的列表(list)。常用于for循环。参数必须是普通整数。 2 参数step默认值为1,参数start的默认值为0。 3 全参数调用该函数将返回一个普通整数列表。 4 step 可以是正整数或者负整数。不可以为0,否则将处罚ValueError异常。 5 range(3)代表0,1,2.等价于range(0,3) 6 >>> range(0,10,2) #第一个参数是起始数,第二个是终止数(不包含这个),第三个数步数 7 >>>[0,2,4,6,8]
53. repr() 将任意值转换为字符串,供计时器读取的形式
1 repr(object) 2 返回一个对象的字符串表示。有时可以使用这个函数来访问操作。 3 对于许多类型来说,repr()尝试返回一个字符串,eval()方法可以使用该字符串产生对象; 4 否则用尖括号括起来的,包含类名称和其他二外信息的字符串被返回。
54. reversed() 反转,逆序对象
1 reversed(seq) 2 返回一个逆序的iterator对象。参数seq必须是一个包含__reversed__()方法的对象或支持序列操作(__len__()和__getitem__()) 3 该函数是2.4中新增的
55. round() 四舍五入
1 round(x [, n]) 2 对参数x的第n+1位小数进行四舍五入,返回一个小数位数为n的浮点数。 3 参数n的默认值是0。结果是一个浮点数。如round(0.5)结果为1.0 4 >>> round(4,6) 5 4 6 >>> round(5,6) 7 5
56. set()
57. setattr() 与getattr()相对应
58. slice() 切片功能
59. sorted() 排序
1 >>> sorted([36,6,-12,9,-22]) 列表排序 2 [-22, -12, 6, 9, 36] 3 >>> sorted([36,6,-12,9,-22],key=abs) 高阶函数,以绝对值大小排序 4 [6, 9, -12, -22, 36] 5 >>> sorted(['bob', 'about', 'Zoo', 'Credit']) 字符串排序,按照ASCII的大小排序 6 ['Credit', 'Zoo', 'about', 'bob'] 7 如果需要排序的是一个元组,则需要使用参数key,也就是关键字。 8 >>> a = [('b',2), ('a',1), ('c',0)] 9 >>> list(sorted(a,key=lambda x:x[1])) 按照元组第二个元素排序 10 [('c', 0), ('a', 1), ('b', 2)] 11 >>> list(sorted(a,key=lambda x:x[0])) 按照元组第一个元素排序 12 [('a', 1), ('b', 2), ('c', 0)] 13 >>> sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower) 忽略大小写排序 14 ['about', 'bob', 'Credit', 'Zoo'] 15 >>> sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower,reverse=True) 反向排序 16 ['Zoo', 'Credit', 'bob', 'about']
60. staticmethod()
61. str() 字符串构造函数
62. sum() 求和
63. super() 调用父类的方法
64. tuple() 元组构造函数
65、 type() 显示对象所属的类
class A:pass a = A() print(type(a)) print(type('aa'))
<class '__main__.A'>
<class 'str'>
66. vars()
67. zip() 将对象逐一配对
1 list_1 = [1,2,3] 2 list_2 = ['a','b','c'] 3 s = zip(list_1,list_2) 4 print(list(s)) 5 6 运行结果: 7 8 [(1, 'a'), (2, 'b'), (3, 'c')]
1 a = [(1,),(2,),(3,)] 2 r = zip(*a) 3 print(list(r)) 4 运行结果: 5 [(1, 2, 3)] 6 print(list(r)[0]) 7 运行结果: 8 (1, 2, 3)
68. __import__()
参考
https://www.cnblogs.com/xiao1/p/5856890.html