1. Built-in functions

函数可能遇到的问题:下面例子函数改变了函数需要传入的参数

li = [11,22,33,44]deff1(arg):
arg.append(55)
f1(li)print(li) #打印结果为 [11,22,33,44,55]

检测传的值能不能调用: callable()

f2 = [1,2,3]print(callable(f1)) #打印结果为True
chr(), ord()针对ASC码对应表的关系
r = chr(65)
o= ord("B")print(r,o) #打印结果为A,66

给一个范围,在范围里生成一个随机数字(随机验证码):random.randrange()

importrandom#生成6次循环
li =[]for i in range(6):
temp= random.randrange(65,91) #65<=temp<91
c =chr(temp)
li.append(c)
result= "".join(li) #join只连接字符串
print(result)#想要第三位数永远是数字
for i in range(5):
r= random.randrange(0,5)if r ==2 and r==4:
num= random.randrange(0,10)
li.append(str(num))else:
temp= random.randrange(65,91) #65<=temp<91
c =chr(temp)
li.append(c)
result= "".join(li) #join只链接字符串
print(result)

如何将字符串转换成python代码并执行:

#1.读取文件内容open,str到内存#2. 将字符串转换成python代码 e.g compile#3. 执行代码 e.g exec
#编译,single(单行),eval(表达式),exec(和python一模一样的)
s = "print(123)"
#将字符串编译成python代码
r = compile(s,"","exec")#执行代码(接收代码或字符串),没有返回值
exec(r)#eval:字符串转表达式并且执行,获取结果为64
s = "8*8"ret=eval(s)print(ret)#exec能执行所有python代码或字符串(内部编译再执行),然而eval只能执行表达式;不过eval多一个返回值功能
查看功能、读源代码
#快速查看一个对象给你提供了什么功能
print(dir(dict))#读源码
print(help(list))
除法运算同时获得商和余数
#97条,一页10条,需要多少页#dimod返回一个元组,包含商和余数
r = divmod(97,10)print(r)#也可以这样获取两个分开的结果
n1,n2 = divmod(97,10)print(n1,n2)
判断对象是不是某个类的实例isinstance()
s = "Alex" #"Alex"是对象,与类有关系#dict,list是类#对象是类的实例#"Alex"是str的实例
#isinstance判断对象是不是某个类的实例
print(isinstance(s,str)) #打印结果为True
filter,map
#filter: 循环第二个参数,让每一个循环元素执行第一个参数(函数);如果函数返回值是True,表示元素合法
li = [11,22,33,44]deff2(a):if a>22:returnTrue
ret= filter(f2,li) #第一个参数是函数,第二个参数是可迭代的对象
print(list(ret)) #打印结果为[33,44]
#lambda函数(也是定义函数一种方式):内部自动return
f1 = lambda a: a > 30ret= f1(90)print(ret) #结果是True
result= filter(lambda a: a>33,li)print(list(result)) #结果为[44]
#map函数将返回元素添加到结果中#可以迭代的对象,可以for循环的东西
li = [11,22,33,44,55]#需求:每个元素加100
'''def f1(args):
result = []
for i in args:
result.append(100+i)
return'''
deff2(a):return a+100result=map(f2,li)print(list(result))#用lambda表达式替代
result = map(lambda a: a+100,li) #将返回值返回
r = filter(lambda a: a+100,li) #将列表元素返回
print(list(result))print(list(r))

其他built-in functions

#globals #代表所有全局变量#locals #代表所有局部变量
NAME= "Alex"
defshow():
a= 123
print(locals())print(globals())
show()#hash():python内部的转换
s = "ifeufgiue"
print(hash(s))#len() in python3,既可以通过字符又可以通过字节查看长度
s = "李杰"b= bytes(s, encoding = "utf-8")
len(b)
len(s)li=[11,22,33,44]
a= max(li) #最大值
b = min(li) #最小值
c = sum(li) #求和
print(a,b,c)
d= pow(2,10) #求指数,same as 2**10
#反转
li.reverse()
reversed(li)print(li)#round四舍五入
x = round(4.556)print(x)#slice#sorted
li.sort()
sorted(li)print(li)#zip()
li = []

2. 关于Decorator

首先函数是可以赋值变量,将函数作为参数,或者将函数作为返回值。而Decorator本质就是将函数作为参数,并且返回函数的函数。

good to read: https://realpython.com/blog/python/primer-on-python-decorators/

关于一个函数的函数:

deff1():print(123)deff2():print(456)deff1():print('123')deff2(xxx):
xxx()

f2(f1)#f2关于f1的函数是f1函数

为了更简洁、明了,python运用Sugar Syntax:@ + 函数名

可实现功能:

1. 自动执行outer函数并且将其下面的函数名f1当作参数传递

2. 将outer函数的返回值,重复赋值给 f1

def outer(func):
def inner(*args, **kwargs):
print('before')
r= func(*args, **kwargs)
print('after')returnrreturninner
@outer
def f1(arg):
print(arg)return "hello"@outer
def f2(a1, a2):
print("F2")
@outer
def f3():
print("F3")

只有outer函数被调用的时候f1才会被调用;Decorator返回inner函数,结果为被修饰过的f1函数:

defouter(func):definner():print('log')returnfunc()returninner
@outerdeff1():print("F1")
@outerdeff2():print("F2")
@outerdeff100():print("F100")
outer(f1())#打印结果为log F1

运用Decorator的注册登录程序模版:

LOGIN_USER = {"is_login": False }defouter(func):def inner(*args, **kwargs):if LOGIN_USER['is_login']:
r=func()returnrelse:print("请登录")returninnerdefouter1(func):def inner(*args, **kwargs):if LOGIN_USER['is_login'] and LOGIN_USER['user_type'] == 2:
r=func()returnrelse:print("请登录,或者权限不够")returninner
@outer1deforder():print("欢迎%s登录" % LOGIN_USER['current_user'])
@outerdefchangepwd():print("欢迎%s登录" % LOGIN_USER['current_user'])
@outerdefmanager():print("欢迎%s登录" % LOGIN_USER['current_user'])deflogin(user, pwd):if user == "alex" and pwd == "123":
LOGIN_USER['is_login'] =True
LOGIN_USER['current_user'] =user
manager()defmain():whileTrue:
inp= input("1,后台管理;2,登录")if inp == '1':
manager()elif inp == '2':
username= input("请输入用户名")
pwd= input("请输入密码")
login(username, pwd)
main()