python周报第四周
0.本周知识点预览
- 内置函数
- 装饰器基础
1.内置函数进阶
1.chr()、ord()
print(chr(66)) print(ord("F"))
执行结果如下
B
70
总结:chr()函数是把数字转换成相应ASCII码对应的值,ord()和chr()相反,可以把ASCII码对应的值转换成数字。
2.random()
import random list = [] for i in range(6): r = random.randrange(0,6) if r == 0 or r == 2: num = random.randrange(0,10) list.append(str(num)) elif r == 1 or r == 3: num = random.randrange(65,91) ret = chr(num) list.append(ret) else: num = random.randrange(97,113) ret = chr(num) list.append(ret)print("".join(list))
执行结果如下
aA3cc4
总结:random模块的randrange()方法返回一个随机数,上述代码返回一个6位随机的验证码。
3.compile()、eval()、exec()
1.compile()
eval_code = compile( '1+2', '', 'eval') ret = eval(eval_code) print(ret)
执行结果如下
3
总结:compile()方法是把str里的语句编译成代码对象
2.eval()
num = 10 ret = eval('num * 7') print(ret)
执行结果如下
70
总结:eval()方法是用来执行字符串中的有效的python表达式,注意eval()是有返回值的。
3.exec()
a=1 exec("a=a+10") print(a)
执行结果如下
11
总结:exec()方法用来执行存储在str中的python代码。
4.dir()、help()
a=[1,2,3] ret = dir(a) print(ret)
执行结果如下
['__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']
========================================================================================
a=[1,2,3] ret = help(a) print(ret)
执行结果如下
Help on list object: class list(object) | list() -> new empty list | list(iterable) -> new list initialized from iterable's items | | Methods defined here: | | __add__(self, value, /) | Return self+value. | | __contains__(self, key, /) | Return key in self.
......
总结:dir()、help()方法会打印函数的帮助信息,help会比dir更详细
5.isinstance()
testlist = [1,2,3] ret1 = isinstance(testlist,list) ret2 = isinstance(testlist,tuple) print(ret1,ret2)
执行结果如下
True False
总结:isinstance()方法,会判断第一个参数是否是第二个参数的子类,返回True或者False。
6.filter()、map()
1.filter()
a= [1,3,5,7,8,9] def f1(num): return num>5 ret = filter(f1,a) print(list(ret))
执行结果如下
[7, 8, 9]
总结:filter()方法的第一个参数是一个函数,第二个参数是一个可迭代的对象,它会循环第二个参数,让每个元素循环执行函数,如果函数返回为True,表示元素合法,添加到结果中。
2.map()
c = [1,3,4,5,7,10] ret = map(lambda num: num + 20,c) print(list(ret))
执行结果如下
[21, 23, 24, 25, 27, 30]
总结:map()方法的第一个参数是一个函数,第二个参数是一个可迭代的对象,它会循环第二个参数,让每个元素循环执行函数,将函数返回值添加到结果中。
7.zip()
a = ["lk",11,22,33] b = ["is",7,8] c = ["god","haha",123] print(list(zip(a,b,c)))
执行结果如下
[('lk', 'is', 'god'), (11, 7, 'haha'), (22, 8, 123)]
总结:zip()函数的参数是N个可迭代的对象,返回值是迭代对象聚合后的元组,用list()可以使其转化为列表。列表长度为最短参数的长度。
2.装饰器
1.初识
1.被装饰函数无返回值
def outer(func):
def inner():
print("logging....")
func()
return inner
@outer
def b1():
print("b1.......")
def b2():
print("b2.......")
def b3():
print("b3.......")
b1()
执行结果如下:
logging....
b1.......
代码剖析:装饰器的用法:@ + 函数名;装饰器的功能:
1.自动执行outer函数,并且将其下面的函数名b1作为参数。
2.将outer函数的返回值,重新赋值给b1,上述代码outer的返回值就是inner()函数体,这个是重点!也就相当于print "logging...." + func(),而func() == 老b1(),故,新的b1()就是print "logging......" + print "b1......"
3.装饰器的用途就是可以在不改变原函数的情况下给函数增加功能。
2.被装饰函数有返回值
def outer(func): def inner(): print("logging....") # func() ret = func() return ret return inner @outer def b1(): return "I love Python" def b2(): print("b2.......") def b3(): print("b3.......") a = b1() print(a)
执行结果如下:
logging....
I love Python
代码剖析:装饰器的用法不多说,上述例子已说明,详细说明一下和上个例子的不同之处
当函数有返回值时,同样inner()方法就相当于b1(),也就是说inner()函数的返回值就是老b1()的返回值。inner()函数的返回值就是ret,也就是老b1()的返回值,也就是"I love Python"
3.被装饰的函数有参数
def outer(func): def inner(number): print("logging....") # func() ret = func(number) return ret return inner @outer def b1(num): return num * num def b2(): print("b2.......") def b3(): print("b3.......") a = b1(9) print(a)
执行结果如下
logging....
81
代码剖析:当被装饰的函数有参数时,一定要铭记一点,装饰器函数的内层函数就相当于被装饰的函数。那么如例子:b1()函数就相当于inner()函数,因为b1()在调用时有参数,并返回参数的平方。这里就需要在inner()函数增加参数,如题是写成inner(number)。而在这里,同样可以写成inner(*args,**kwargs)的万能参数的形式。
4.场景举例
LOGIN = False def outer(func): def inner(): if LOGIN: func() else: print("请登录!!!!!") return inner @outer def message(): print("欢迎登陆") exit() def login(user,pwd): if user == "liukai" and pwd == "123": global LOGIN LOGIN = True message() def main(): while True: print("1:管理,2:登陆") inp = input("请输入: ") if inp == "1": message() elif inp == "2": userinput = input("请输入用户名: ") passwdinput = input("请输入密码: ") login(userinput,passwdinput) main()
执行结果如下:
1:管理,2:登陆 请输入: 1 请登录!!!!! 1:管理,2:登陆 请输入: 1 请登录!!!!! 1:管理,2:登陆 请输入: 2 请输入用户名: liukai 请输入密码: 123 欢迎登陆
代码剖析:当首次选择管理后,会因为LOGIN = False 而无限循环,当选择登陆并用户密码输入正确后,会调用message()函数,全局变量LOGIN变为True。而message()函数被outer装饰了,当LOGIN为True时,执行message()函数,当LOGIN为False时,打印重新登陆。
2.进阶
1.装饰器带参数
def base(num): def outer(func): def inner(number): print("logging....") print("--- [%s] ---" % num) # func() ret = func(number) return ret return inner return outer @base("123") def b1(num): return num * num def b2(): print("b2.......") def b3(): print("b3.......") a = b1(9) print(a)
执行结果如下
logging....
--- [123] ---
81
代码剖析:对于无参数的装饰器,其装饰器函数的参数是要被装饰的函数名,对于有参数的装饰器在调用时使用的是传入的参数,所以必须在内部再定义一个函数outer()来接收要被装饰的函数对象。