day 12 内置函数,装饰器,递归函数
内置函数
内置函数:python给咱们提供了一些他认为你会经常用到的函数,68种
内置函数 | ||||
abs() | dict() | help() | min() | setattr() |
all() | dir() | hex() | next() | slice() |
any() | divmod() | id() | object() | sorted() |
ascii() | enumerate() | input() | oct() | staticmethod() |
bin() | eval() | int() | open() | str() |
bool() | exec() | isinstance() | ord() | sum() |
bytearray() | filter() | issubclass() | pow() | super() |
bytes() | float() | iter() | print() | tuple() |
callable() | format() | len() | property() | type() |
chr() | frozenset() | list() | range() | vars() |
classmethod() | getattr() | locals() | repr() | zip() |
compile() | globals() | map() | reversed() | __import__() |
complex() | hasattr() | max() | round() | |
delattr() | hash() | memoryview() | set() |
按星级划分
❤ ❤ ❤ 死记
locals :函数会以字典的类型返回当前位置的全部局部变量(函数中,返回函数内的变量。函数外,返回全局变量)
globals:函数以字典的类型返回全部全局变量
a = 1 b = 2 def func(): name = 'alex' age = 12 print(locals()) # {'age': 12, 'name': 'alex'} 局部变量 print(globals()) # {'__name__': '__main__', '__doc__': None, ... 'a': 1, 'b': 2} func()
input: 函数接受一个标准输入数据,返回为 string 类型。
pass
print: 打印输出。(step= ‘ ’, end=' ' )
print('alex','chencp', sep='|') # alex|echo 默认是空格 print('123', end=' ') # 123 456 不换行 print('456')
open:用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。
pass
callable:用于检查一个对象是否是可调用的。True 可调用,False 不可调用
a = 1 def func(): pass func() print(callable(func)) #func可调用 print(callable(a)) # False
dir:函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
l1 = [1 ,2 ,3 ,4] print(dir(l1)) # 可以看到__iter__
range:函数可创建一个整数对象,一般用在 for 循环中
pass
next:内部实际使用了__next__方法,返回迭代器的一个值
pass
iter:函数用来生成迭代器(将一个可迭代对象,生成迭代器)
l1 = [1 ,2 ,3 ,4] s1 = iter(l1) for i in s1: print(i)
bool :用于将给定参数转换为布尔类型,如果没有参数,返回 False。
pass
int:函数用于将一个字符串或数字转换为整型。
pass
divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)
print(divmod(7,2)) # (3, 1) 7/2 商 3 余 1
sum:对可迭代对象进行求和计算(可设置初始值)
print(sum([1,2,3])) # 6 print(sum((1, 2, 3),100)) # 106
min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值)。
dic = {'a': 3, 'b': 2, 'c': 1} print(min(dic)) # a 键的最小值 print(min(dic, key=lambda x: dic[x])) # c 最小值得键 print(dic[min(dic, key=lambda x: dic[x])]) # 1 最小值
max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值
l1 = [('a', 3), ('b', 2), ('c', 1)] print(max(l1)) # ('c', 1) print(max(l1, key=lambda x: x[1])) # 取三个元组,拿索引为[1]的值,比较
list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素)
pass
tuple:将一个可迭代对象转化成元祖(如果是字典,默认将key作为元祖的元素)
pass
reversed:将一个序列翻转,并返回此翻转序列的迭代器
ite = reversed(['a',2,3,'c',4,2]) # 将列表反转 print(ite) # 可迭代器<list_reverseiterator object at 0x0000020F7DA27630> for i in ite: print(i)
str:将数据转化成字符串
pass
bytes:用于不同编码之间的转化
s = '你好' bs = bytes(s,encoding='utf-8') print(bs)
dict:创建一个字典。
pass
set:创建一个集合
pass
len:返回一个对象中元素的个数。
pass
sorted:对所有可迭代的对象进行排序操作
# 按年龄排倒叙,sorted会创建一个新列表 students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] l1 = sorted(students, key=lambda x:x[2], reverse=True) print(l1)
enumerate:枚举,返回一个枚举对象
dic = {'name':'alex', 'age': 18, 'hobby':'basketball'} for k in enumerate(dic, start=1): print(k)
print(enumerate([1, 2, 3])) # <enumerate object at 0x000001F4D62811B0> for i in enumerate([1, 2, 3]): print(i, end='') # (0, 1)(1, 2)(2, 3) for i in enumerate([1, 2, 3], 100): print(i, end='') # (100, 1)(101, 2)(102, 3)
zip:将索引相同的元素,组成一个元组
l1 = [1, 2, 3, ] l2 = ['a', 'b', 'c', 5] l3 = ('*', '**', (1, 2, 3)) for i in zip(l1, l2, l3): print(i) # (1, 'a', '*') 把每个列表索引相同的元素,组成一个元组 # (2, 'b', '**') # (3, 'c', (1, 2, 3))
filter:过滤·
# filter 过滤 通过你的函数,过滤一个可迭代对象,返回的是True # 类似于[i for i in range(10) if i > 3] 列表推导式的筛选模式 def func(x): return x % 2 == 0 ret = filter(func, [1, 2, 3, 4, 5, 6, 7]) print(ret) # <filter object at 0x000001FA908F10B8> for i in ret: print(i) # 2, 4, 6
map:会根据提供的函数对指定序列做映射
def square(x): # 计算平方数 return x ** 2 map(square, [1, 2, 3, 4, 5]) # 计算列表各个元素的平方 # [1, 4, 9, 16, 25] map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数 # [1, 4, 9, 16, 25] # 提供了两个列表,对相同位置的列表数据进行相加 l1 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) print(l1) # <map object at 0x000002CEF7F420B8> for i in l1: print(i) # [3, 7, 11, 15, 19]
❤❤ 记住
1.2.1 字符串类型代码的执行 eval,exec,complie 慎用
eval:执行字符串类型的代码,并返回最终结果
print(eval('1+2+3')) # 6 n=81 eval("n + 4") # 85 eval('print(666)') # 666
exec:执行字符串类型的代码。
s = ''' for i in [1,2,3]: print(i) ''' exec(s) # 直接执行for循环
compile:将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求
''' 参数说明: 1. 参数source:字符串或者AST(Abstract Syntax Trees)对象。即需要动态执行的代码段。 2. 参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。当传入了source参数时,filename参数传入空字符即可。 3. 参数model:指定编译代码的种类,可以指定为 ‘exec’,’eval’,’single’。当source中包含流程语句时,model应指定为‘exec’;当source中只包含一个简单的求值表达式,model应指定为‘eval’;当source中包含了交互式命令语句,model应指定为'single'。 ''' >>> #流程语句使用exec >>> code1 = 'for i in range(0,10): print (i)' >>> compile1 = compile(code1,'','exec') >>> exec (compile1) >>> #简单求值表达式用eval >>> code2 = '1 + 2 + 3 + 4' >>> compile2 = compile(code2,'','eval') >>> eval(compile2) >>> #交互语句用single >>> code3 = 'name = input("please input your name:")' >>> compile3 = compile(code3,'','single') >>> name #执行前name变量不存在 Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> name NameError: name 'name' is not defined >>> exec(compile3) #执行时显示交互命令,提示输入 please input your name:'pythoner' >>> name #执行后name变量有值 "'pythoner'"
help:函数用于查看函数或模块用途的详细说明。
print(help(print))
__import__:函数用于动态加载类和函数
pass
hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值
str = 'alex' print(hash(str))
id:用于获取对象的内存地址
pass
float:函数用于将整数和字符串转换成浮点数
pass
bin:将十进制转换成二进制并返回。
oct:将十进制转化成八进制字符串并返回。
hex:将十进制转化成十六进制字符串并返回。
print(bin(10)) # 0b1010 二进制 print(oct(10)) # 0o12 八进制 print(hex(10)) # 0xa 十六进制
abs:函数返回数字的绝对值
print(abs(-5)) # 5 绝对值
round:保留浮点数的小数位数,默认保留整数。
print(round(7/3,2)) # 2.33 保留2位 print(round(7/3)) # 2 默认保留整数 print(round(3.32567,3)) # 3.326 保留3位
pow:求x**y次幂。(三个参数为x**y的结果对z取余
print(pow(2,3)) # 两个参数为2**3次幂 print(pow(2,3,3)) # 三个参数为2**3次幂,对3取余
frozenset:返回一个冻结的集合,冻结后集合不能再添加或删除任何元素
set1 = {1, 2, 3, 4} set1.add(22) set1 = frozenset(set1) set1.add(33) # AttributeError: 'frozenset' object has no attribute 'add' print(set1, type(set1))
all:可迭代对象中,全都是True才是True
any:可迭代对象中,有一个True 就是True
print(all([1,2,True,0])) # False print(any([1,'',0])) # True
❤了解
complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。
pass
slice:构造一个切片对象,用于列表的切片 , 定义之后所有的列表的都会改变
li = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] sli_obj = slice(3) # 切片 print(li[sli_obj]) # ['a', 'b', 'c'] sli_obj = slice(0, 7, 2) # 切片 + 步长 print(li[sli_obj]) # ['a', 'c', 'e', 'g']
format:与具体数据相关,用于计算各种小数,精算等
#字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐 print(format('test', '<20')) print(format('test', '>20')) print(format('test', '^20')) #整形数值可以提供的参数有 'b' 'c' 'd' 'o' 'x' 'X' 'n' None >>> format(3,'b') #转换成二进制 '11' >>> format(97,'c') #转换unicode成字符 'a' >>> format(11,'d') #转换成10进制 '11' >>> format(11,'o') #转换成8进制 '13' >>> format(11,'x') #转换成16进制 小写字母表示 'b' >>> format(11,'X') #转换成16进制 大写字母表示 'B' >>> format(11,'n') #和d一样 '11' >>> format(11) #默认和d一样 '11' #浮点数可以提供的参数有 'e' 'E' 'f' 'F' 'g' 'G' 'n' '%' None >>> format(314159267,'e') #科学计数法,默认保留6位小数 '3.141593e+08' >>> format(314159267,'0.2e') #科学计数法,指定保留2位小数 '3.14e+08' >>> format(314159267,'0.2E') #科学计数法,指定保留2位小数,采用大写E表示 '3.14E+08' >>> format(314159267,'f') #小数点计数法,默认保留6位小数 '314159267.000000' >>> format(3.14159267000,'f') #小数点计数法,默认保留6位小数 '3.141593' >>> format(3.14159267000,'0.8f') #小数点计数法,指定保留8位小数 '3.14159267' >>> format(3.14159267000,'0.10f') #小数点计数法,指定保留10位小数 '3.1415926700' >>> format(3.14e+1000000,'F') #小数点计数法,无穷大转换成大小字母 'INF' #g的格式化比较特殊,假设p为格式中指定的保留小数位数,先尝试采用科学计数法格式化,得到幂指数exp,如果-4<=exp<p,则采用小数计数法,并保留p-1-exp位小数,否则按小数计数法计数,并按p-1保留小数位数 >>> format(0.00003141566,'.1g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点 '3e-05' >>> format(0.00003141566,'.2g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留1位小数点 '3.1e-05' >>> format(0.00003141566,'.3g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留2位小数点 '3.14e-05' >>> format(0.00003141566,'.3G') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点,E使用大写 '3.14E-05' >>> format(3.1415926777,'.1g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留0位小数点 '3' >>> format(3.1415926777,'.2g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留1位小数点 '3.1' >>> format(3.1415926777,'.3g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留2位小数点 '3.14' >>> format(0.00003141566,'.1n') #和g相同 '3e-05' >>> format(0.00003141566,'.3n') #和g相同 '3.14e-05' >>> format(0.00003141566) #和g相同 '3.141566e-05'
bytearry:类似bytes,返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256
ret = bytearray('alex',encoding='utf-8') print(id(ret)) #2339149608640 print(ret) # bytearray(b'alex') print(ret[0]) # 97 a的ascii码 ret[0] = 65 print(ret) # bytearray(b'Alex') print(id(ret)) # 2339149608640
memoryview
ret = memoryview(bytes('你好',encoding='utf-8')) print(len(ret)) # 6 print(ret) # <memory at 0x00000226AD062048> print(bytes(ret[:3]).decode('utf-8')) # 你 print(bytes(ret[3:]).decode('utf-8')) # 好
ord:输入字符找该字符编码的位置
chr:输入位置数字找出其对应的字符
ascii:是ascii码中的返回该值,不是就返回/u..
# ord 输入字符找该字符编码的位置 print(ord('a')) # 97 print(ord('中')) # 20013 # chr 输入位置数字找出其对应的字符 print(chr(97)) # a print(chr(20013)) # 中 # 是ascii码中的返回该值,不是就返回\u... print(ascii('a')) # a print(ascii('中')) # '\u4e2d'
repr:返回一个对象的string形式(原形毕露)
a = 'nihao ' print(a) # nihao print(repr(a)) # 'nihao '
装饰器
装饰器: 装饰器的本质是闭包,而且装饰器其实就是一个函数
装饰器:在不改变原函数调用方式上,给原函数增加一些额外的功能。登录验证,写日志,执行效率等时候使用
开放封闭原则:
对外扩展开放
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
对内修改封闭 (不允许修改函数)
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户
装饰器完美的遵循了这个开放封闭原则。
# 装饰器的标准格式 def wrapper(f): # f = func def inner(*args, **kwargs): '''执行被装饰函数之前的操作''' ret = f(*args, **kwargs) # ret = func(*args, **kwargs) ; func()函数开始运行 '''执行被装饰函数之后的操作''' return ret # 将返回值返回给执行者 inner(),也就是func() return inner
def wrapper(f): # f = func def inner(*args, **kwargs): '''执行被装饰函数之前的操作''' ret = f(*args, **kwargs) # ret = func(*args, **kwargs) ; func()函数开始运行 '''执行被装饰函数之后的操作''' return ret # 将返回值返回给执行者 inner(),也就是func() return inner @wrapper # func = wrapper(func); wrapper()函数开始运行 def func(): print(666) func() # func() = inner() ; inner()函数开始运行