python第四周小测验答案_python周报第四周

0.本周知识点预览

内置函数

装饰器基础

1.内置函数进阶

1.chr()、ord()

print(chr(66))print(ord("F"))

执行结果如下

B70

总结:chr()函数是把数字转换成相应ASCII码对应的值,ord()和chr()相反,可以把ASCII码对应的值转换成数字。

2.random()

importrandom

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 = 10ret= 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:classlist(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]deff1(num):return num>5ret=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.被装饰函数有返回值

defouter(func):definner():print("logging....")#func()

ret =func()returnretreturninner

@outerdefb1():return "I love Python"

defb2():print("b2.......")defb3():print("b3.......")

a=b1()print(a)

执行结果如下:

logging....

I love Python

代码剖析:装饰器的用法不多说,上述例子已说明,详细说明一下和上个例子的不同之处

当函数有返回值时,同样inner()方法就相当于b1(),也就是说inner()函数的返回值就是老b1()的返回值。inner()函数的返回值就是ret,也就是老b1()的返回值,也就是"I love Python"

3.被装饰的函数有参数

defouter(func):definner(number):print("logging....")#func()

ret =func(number)returnretreturninner

@outerdefb1(num):return num *numdefb2():print("b2.......")defb3():print("b3.......")

a= b1(9)print(a)

执行结果如下

logging....81

代码剖析:当被装饰的函数有参数时,一定要铭记一点,装饰器函数的内层函数就相当于被装饰的函数。那么如例子:b1()函数就相当于inner()函数,因为b1()在调用时有参数,并返回参数的平方。这里就需要在inner()函数增加参数,如题是写成inner(number)。而在这里,同样可以写成inner(*args,**kwargs)的万能参数的形式。

4.场景举例

LOGIN =Falsedefouter(func):definner():ifLOGIN:

func()else:print("请登录!!!!!")returninner

@outerdefmessage():print("欢迎登陆")

exit()deflogin(user,pwd):if user == "liukai" and pwd == "123":globalLOGIN

LOGIN=True

message()defmain():whileTrue: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.装饰器带参数

defbase(num):defouter(func):definner(number):print("logging....")print("--- [%s] ---" %num)#func()

ret =func(number)returnretreturninnerreturnouter

@base("123")defb1(num):return num *numdefb2():print("b2.......")defb3():print("b3.......")

a= b1(9)print(a)

执行结果如下

logging....--- [123] ---

81

代码剖析:对于无参数的装饰器,其装饰器函数的参数是要被装饰的函数名,对于有参数的装饰器在调用时使用的是传入的参数,所以必须在内部再定义一个函数outer()来接收要被装饰的函数对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值