python-内置函数、装饰器

时间:2021-04-21 19:14:23
本节内容:
python-内置函数、装饰器
一之前课程回顾:

python-内置函数、装饰器
在书写代码的时候,先写简单的逻辑在写复杂的逻辑。
概念梳理:
1、函数在传递实参的时候是传递的是引用而不是从内存中重新赋相同值给形参。
比如:
1 def test(x):
2     x.append(55)
3 
4 
5 list_1=[1,2,3,4,]
6 test(list_1)
7 print(list_1)
8 [1, 2, 3, 4, 55]
 

 

2、函数名带圆括号和不带圆括号。
 1 def test(x):
 2     x.append(55)
 3 
 4 
 5 list_1=[1,2,3,4,]
 6 a=test(list_1)
 7 b=test
 8 print(list_1)
 9 print(b,a)
10 
11 [1, 2, 3, 4, 55]
12 <function test at 0x027117C8> None
 

 

函数名带圆括号是函数的调用,由于函数test没有返回值,所以输出None,而函数名代表的是函数体,上面是把函数体test赋值给b。
所以可以直接执行b函数和执行test函数是一样的。
 1 def test(x):
 2     x.append(55)
 3     return 'b'
 4 
 5 list_1=[1,2,3,4,]
 6 a=test(list_1)
 7 b=test
 8 print(list_1)
 9 print(b,a)
10 res=b(list_1)
11 print('this is b '+res)
12 
13 [1, 2, 3, 4, 55]
14 <function test at 0x027017C8> b
15 this is b b
 

 

3、函数返回值
1 def test2(x):
2     x.append(12)
3 lz=[1,2,3,]
4 lz=test2(lz)
5 print(lz)
6 
7 None
 

 

在函数没有返回值的时候默认是None。
4、python 中的为False:0、False、[]、{}、()、''、""。空列表、空字典、空字符创、空元组都是False.
二:内置函数
1:callable()该函数检测对象是否可以被调用。不常用这个函数。
 1 def test2(x):
 2     x.append(12)
 3 res=callable(test2)
 4 print(res)
 5 TEST=34
 6 res_1=callable(TEST)
 7 print(res_1)
 8 
 9 True
10 False
 

 

2:chr()、odr()
字母在ASCII数字表示范围,大写字母在(65-90)小写字母在(97-122)
python-内置函数、装饰器
chr()是把数字转换成对应的字母。
1 a=chr(78)
2 print(a)
3 N
 

 

ord()是把对应的字母转成数字。
1 b=ord('a')
2 print(b)
3 97
 

 

应用:
我们经常在网站登录时候或者购买商品提交的时候,会有验证码的填写。那用python 如何产生随机的验证码?

 1 import random
 2 num=random.randint(1,9)
 3 num_1=random.randint(65,91)
 4 st_1=chr(num_1)
 5 sj=[]
 6 for i in range(7):
 7     m=random.randint(0,7)############需要注意的是这个,这个保证产生的验证码是随机的。如果指定的位置为数字或者字母,那就不是随机验证码。
 8     if m==2 or m==0:
 9         sj.append(num)
10     else:
11         sj.append(st_1)
12 print('%s%s%s%s%s%s%s'%(sj[0],sj[1],sj[2],sj[3],sj[4],sj[5],sj[6]))
13 
14 SS6SSSS
 

 

3、python代码是如何执行呢?
python-内置函数、装饰器
模拟这个过程:
1 s='print([1,2,3,])'
2 t=compile(s,'','exec')##s是指可读取字符串的文件或者变量.内置函数compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1),
3 exec(t)###其中‘’表示字符串(或用""),可以在引号内填写任意内容。'exec'表示执行以哪种方式执行,exec表示一系列python语句,eval表示的是表达式可以进行求值。single表示单一的语句。 4 [1, 2, 3]
 
eval():通常用在表达式上,他有返回值。返回值是该表达是的值。表达式为字符串、后者是python表达式或者经过函数compile()编译过的代码。
其中表示:
The source may be a string representing a Python expression or a code object as returned by compile().
1 t=eval('2+2')
2 print(t)
3 4
1 t='2*2+3'
2 s=compile(t,'','eval')
3 h=eval(s)
4 print(h)
5 7
eval()可以直接接受字符串表达式。
exec(),也可以处理字符串,但是没有返回值。也可以接受经过函数compile()编译过的代码。
1 t='print(2*2+3)'
2 print(exec(t))
3 7
4 None
以后再模板引用的时候会用到把字符串格式的代码编译执行。

python-内置函数、装饰器

上述就是html格式的转换成一个函数,并为该函数提供全局变量,然后执行该函数。
将字符串格式转换成代码格式,并执行。
dir()和help()函数,他两个都是查看函数或者类的帮助文档。只是help()查看内容更为详细。而dir只是列出有什么方法和函数。
python-内置函数、装饰器
help()
python-内置函数、装饰器
 dimovd(x,y)求商和余数。x是被除数,y是余数。返回值是商和余数的元组。常用于分页计算。
1 t=divmod(10,3)
2 print(t)
3 (3, 1)
 

 

 实例是类的具体对象,他继承了类的所有特性(函数方法等。)比如如下字符串'abc'继承str所有的方法和函数。
python-内置函数、装饰器
isinstance(object,class or type)就是判断一个对象是否一个类的的实例,返回值是True或者False.
1 a='abc'
2 t=isinstance(a,str)
3 print(t)
4 True
和type()区别:instance() 和type() instance() 中后面是基类或者父类 返回的也是TRUE 而 type()  只是返回一个当前一个类。

filter(x,y)函数,把符合的条件可以迭代的元素 生成一个生成器,然后用相应的函数进行转换。一般做筛选使用。
1 def test(x):
2     if x>3:
3         return True
4 x=[1,2,3,4,5,]
5 t=filter(test,x)
6 print(list(t))
7 
8 [4, 5]
整个过程:

 

 python-内置函数、装饰器

 1 def test(x):
 2     if x>3:
 3         return False
 4     else:
 5         return True
 6 x=[1,2,3,4,5,]
 7 t=filter(test,x)
 8 print(list(t))
 9 
10 [1, 2, 3]
 

 

 lambda(),返回值是布尔值,可以用lambda和filter结合使用。
1 x=1
2 test=lambda a:a>2
3 print(test(x))
4 
5 False
可以用2者结合。
1 x=[1,2,3,4,]
2 test=filter(lambda a:a>2,x)
3 print(list(test))
4 [3, 4]
 

 

 map()函数是对批量的对象进行相同的操作。同样也可以和lambda结合使用。
1 x=[1,2,3,4,]
2 t=map(lambda a:a+2,x)
3 print(list(t))
4 [3, 4, 5, 6]
 

len()函数计算字符长度。在不通的版本计算的方法不通,在python3中计算的是字符个数,如果在3中想计算字节的个数可以用bytes()函数转换成字节在用len()函数计算,是把字符转换成字节。在python2中计算字节的个数。

1 print(len('生活'))
2 print(len(bytes('生活',encoding='gbk')))
3 print(len(bytes('生活',encoding='utf-8')))
4 
5 2
6 4
7 6

 

 

max(),min(),sum函数。分别的是求最大值、最小值、求和。
1 test_list=[1,2,3,4,]
2 print(max(test_list))
3 print(min(test_list))
4 print(sum(test_list))
5 
6 
7 4
8 1
9 10
 

 

hash()函数将字符或者其他对象求hash值。我们接触字典的key值就是hash值存储到磁盘。而且键值是可hash的。
1 print(hash('a'))
2 1059073218
 

 

pow()函数是求平方。等同于**
1 a=pow(2,4)
2 print(a)
3 b=2**4
4 print(b)
5 16
6 16
 

 

 reversed()函数是反转的意思  但是并不操作原先的对象,而是生成新生成器对象,可以进行遍历的。
 1 test_list=[3,2,1]
 2 t=reversed(test_list)
 3 print(t)
 4 print(test_list)
 5 for i in t:
 6     print(i)
 7 <list_reverseiterator object at 0x026701D0>
 8 [3, 2, 1]
 9 1
10 2
11 3
 

 

而字典的reserse()函数是直接操作原先的对象,进行反转。
1 test_list=[3,2,1]
2 test_list.reverse()
3 print(test_list)
4 [1, 2, 3]
 

 

 round()四舍五入。
1 print(round(1.2))
2 print(round(1.5))
3 1
4 2
 

 

sorted() 排序从小打到。之前用过排序字典的key值,来保证有序输出
1 test_list=[1,3,2,4,]
2 print(sorted(test_list))
3 [1, 2, 3, 4]
 

 

 zip()函数显示2个对象的都拥有的元素元组的列列表。
1 list_1=[1,2,3,4]
2 list_2=[1,2,3,]
3 list_3=[1,2,]
4 print(list(zip(list_1,list_2,list_3)))
5 
6 [(1, 1, 1), (2, 2, 2)]
 
三:装饰器,功能在不修改类和函数的代码基础上加的额外功能。(函数可以做为实参赋值给形参。)
 1 USER_INFO={'evil':'123'}
 2 AUTH_DIC={
 3     'AUTH_FLAG':False
 4 }
 5 pre='''
 6 1:login
 7 2:change password'''
 8 def test(func):
 9     def prvi():
10         if AUTH_DIC['AUTH_FLAG']==False:
11             print('login first!')
12         else:
13             func()
14     return prvi
15 
16 def login(username,password):
17     if username=='evil'and password=='123':
18         print('login successful!')
19         return True
20     else:
21         print('login fail')
22 @test
23 def chpass():
24     new_password=input('entre new password:')
25     USER_INFO['evil']=new_password
26 def login_main():
27     while True:
28         print(pre)
29         choice=input('entre your choice:')
30         if choice=='1':
31             username=input('entre your login username:')
32             password=input('entre your login password:')
33             res=login(username,password)
34             if res:
35                 AUTH_DIC['AUTH_FLAG']=True
36                 continue
37             else:
38                 AUTH_DIC['AUTH_FLAG']=False
39                 continue
40         elif choice=='2':
41             chpass()
42             print(USER_INFO)
43 login_main()
44 
45 
46 1:login
47 2:change password
48 entre your choice:2
49 login first!
50 
51 1:login
52 2:change password
53 entre your choice:1
54 entre your login username:evil
55 entre your login password:123
56 login successful!
57 
58 1:login
59 2:change password
60 entre your choice:2
61 entre new password:
 

 

上面是简单的验证权限问题,在用户没登陆之前不能做修改密码的操作,在登陆之后可以进行修改密码的操作。
装饰器的语法:
 1 def outer(func):            ##定义装饰器函数outer并且参数为被装饰的函数整体。
 2     def inner():            ##定义inner函数并做为outer函数的返回值,赋予func函数。
 3         print('do before')
 4         func()
 5         print('do afer')
 6         return True
 7     return inner
 8 @outer
 9 def f1():
10     print(1+2)
11 
12 f1()
13 
14 do before
15 3
16 do afer
 

 

语法:@函数名
1:自动执行outer()函数并且将下面的函数f1当做参数传递。
2:将outer函数的返回值,重新赋值给f1。
执行顺序:
python-内置函数、装饰器
python执行顺序是,从上到下,先将outer函数加载到内存,然后把函数f1加载到内存。在执行f1的时候,由于f1被outer装饰,f1作为实参赋值给outer函数的形参func,然后将outer函数的返回函数inner赋值给f1,
所以执行inner函数,因为到func()的调用时候,执行f1的旧函数的函数体,也就是7,执行完在执行第8步,如果f1有返回值,那么inner函数将返回相同的返回值。

如果函数有参数的时候,参数的对应是一一对应。
为了解决不同的被装饰的函数的参数个数问题,避免出现参数个数报错。可以用万能参数,来避免这个错误。
 1 def outer(func):
 2     def inner(*args,**kwargs):
 3         print('do before')
 4         func(*args,**kwargs)
 5         print('do afer')
 6     return inner
 7 @outer
 8 def f1():
 9     print(1+2)
10 @outer
11 def f2(x,y):
12     print(x*y)
13 
14 f1()
15 f2(1,2)
16 do before
17 3
18 do afer
19 do before
20 2
21 do afer
 

 

装饰器应用场景:大部分都是用来权限的验证。