python基础知识四
博客参考老师文章:http://www.cnblogs.com/wupeiqi/
博客参考老师文章:http://www.cnblogs.com/luotianshuai/
知识点
def函数的坑 li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) # 因为函数中没有return,所以默认返回None(li = None) print(li) # None f1(li) print(li) # [11, 22, 33, 44, 55]
今日知识:
一、lambda表达式
lambda表达式,也是简单的函数:
# ###################### 普通函数 ###################### # 定义函数(普通方式) def func(arg): return arg + 1 # 执行函数 result = func(100)
print (result) # 101 # ###################### lambda ###################### # 定义函数(lambda表达式) my_lambda = lambda arg : arg + 1 # 执行函数 result = my_lambda(100)
print (result) # 101
#自动返回return
f1 = lambda a: a > 20
ret = f1(30)
print(ret) #True
二、内置函数
abs()
print(abs(-1)) #返回绝对值 1
all()
li = [11,22,33] print(all(li)) #所有为真时,则返回True True l2 = [11,22,0] print(all(l2)) #有一个为假时,则返回False
any()
l1 = [0,0,[],()] print(any(l1)) #所有为假时,则返回False l2 = [1,0,[],()] print(any(l2)) #有一个为真时,则返回True True
bin()
print(bin(10)) #返回一个二进制数 0b1010
bytes()
s = "于晓艳" print(bytes(s,encoding='utf-8')) #以utf-8的形式返回一个值 b'\xe4\xba\x8e\xe6\x99\x93\xe8\x89\xb3'
callable()
def f1(): print("hello world") c = callable(f1) print(c) #Ture #查看参数是否可以被调用
chr() & ord()
print(chr(65)) #接收一个数字,返回acsii表中对应的值 A
print(ord("A"))
#接收一个值,返回acsii表中对应的值 65
bool()
print(bool("a")) #True print(bool([])) #False #根据参数,返回False或True
dir(),help()
print(dir(list)) """ ['__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'] """ help(list) """ Help on class list in module builtins: 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. ............... """ # 快速查看,对象提供了那些功能
divmod()
r = divmod(100, 10) print(r) #(10, 0) # 返回一个元组,第一个元素代表商,第二个元素代表余数
a1,a2 = divmod(100,9)
print(a1,a2)
isinstance()
s = [11,11,11] # 用于判断,对象是否是某个类的实例 r = isinstance(s,list) print(r) #True
filter(函数,可迭代的对象)
#filter,循环第二个参数,让每个循环的元素,执行参数一(函数);当执行结果返回True,则接收,返回False,中丢弃
li = [11,22,33,44,55] def f1(arg): if arg > 22: # 过滤,比较 return True result = filter(f1,li) print(list(result)) #[33, 44, 55]
#filter内部,循环第二个参数
# for item in li:
# r = f1(item)
# if r:
# result(item)
# return result
compile()
s = """for i in range(4): print(i) """ #编译,编译模式(single(单行),eval(表达式),exec(跟python一样的)) r = compile(s,"sting","exec") #执行python代码,接收:代码或都字符串 exec(r) s ="print([11,22,33,44])" r = compile(s,"string",'exec') result = eval(r) # [11, 22, 33, 44] print(result) # None #执行表达式,并且获取结果 a = "8 * 8" res = eval(a) # print(res) # 64
map()
#map('函数',"可迭代的对象")
#正常实现功能 li = [11,22,33,44,55,] def f2(arg): result = [] for i in arg: result.append(i + 100) return result s = f2(li) print(s) # [111, 122, 133, 144, 155]
#使用map()实现功能 li = [11,22,33,44,55,] def f2(args): return args + 100 result = map(f2,li) print(list(result)) # [111, 122, 133, 144, 155]
#使用map()加lambda,实现功能 result = map(lambda a: a+100,li) print(list(result)) # [111, 122, 133, 144, 155]
float()
#返回一个浮点数 print(float(50)) # 50.0
globals() & locals()
NAME = 'RAIN' def show(): s = 123 print(locals()) print(globals()) show() #{'s': 123} #{'__package__': None, 'NAME': 'RAIN', '__cached__': None, '__name__': '__main__', '__spec__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000685908>, '__file__': 'E:/PyCharm4.5.2/PyCharm 文件/day4/内置函数.py', '__doc__': None, 'show': <function show at 0x0000000000B3F730>, '__builtins__': <module 'builtins' (built-in)>}
hash() 用来将对象转换成hash值,一般用来做字典的key转换
ha = "hash hash" print(hash(ha)) #-1596869942863300395
hex()
#十进制转十六进制 print(hex(100)) #0x64
id()
#查看参数的内存地址 print(id("abc")) #6587872
input()
#默认接收一个字符串的值 str = input("hello world:") print(str) # hello world:hello world # hello world
int()
#将字符串中的数字转换成int a = int("11") print(a,type(a))
#11 <class 'int'>
len()
#查看该列表中总共有几个元素 li = [11,22,33,44,] print(len(li)) a = "于晓艳" print(len(a)) #python3.x 默认返回 3 a = "于晓艳" b = bytes(a,encoding='utf-8') print(len(b)) # 返回 9 # b'\xe4\xba\x8e\xe6\x99\x93\xe8\x89\xb3'
max() & min() & sum()
li = [11,6,99,34,100] print(max(li)) #最大值 100 print(min(li)) #最小值 6 print(sum(li)) #元素之和 250
oct()
#十转十六 print(oct(100)) # 0o144
pow()
#返回n的n次方 r = pow(2,10) print(r) #1024
reversed()
li = [11,22,33,44] print(list(reversed(li))) # [44, 33, 22, 11]
round()
print(round(11.1)) # 11 print(round(11.9)) # 12
vars() #指当前模块中有哪些变量可供使用
zip()
li = ["rain",11,22,33] l2 = ["sunny",11,22,33] l3 = ["ray",11,22,33] print(list(zip(li,l2,l3))) [('rain', 'sunny', 'ray'), (11, 11, 11), (22, 22, 22), (33, 33, 33)] li = ["rain",11,22,33] l2 = ["sunny",11,22] print(list(zip(li,l2))) # [('rain', 'sunny'), (11, 11), (22, 22)] r = zip(li,l2,l3) temp = list(r)[0] a = " ".join(temp) print(a) # rain sunny ray
三、 装饰器
# 装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。
# 简单的来说在不修改原函数的情况下,在对原函数进行包装!
1、基础原代码
############### 基础平台提供的功能如下 ############### def f1(): print("f1") def f2(): print("f2") def f100(): print("f100") ############### 业务部门A 调用基础平台提供的功能 ############### f1() f2() f3() f4()
############### 业务部门B 调用基础平台提供的功能 ############### f1() f2() f3() f4()
2、现需要对基础平台的所有功能进行重构,为平台提供的所有功能添加验证机制,即:执行功能前,先进行验证。
1)只对基础平台的代码进行重构,让N业务部门无需做任何修改
############### 基础平台提供的功能如下 ############### def f1(): # 验证1 # 验证2 # 验证3 print 'f1' def f2(): # 验证1 # 验证2 # 验证3 print 'f2' def f3(): # 验证1 # 验证2 # 验证3 print 'f3' def f4(): # 验证1 # 验证2 # 验证3 print 'f4' ############### 业务部门不变 ############### ### 业务部门A 调用基础平台提供的功能### f1() f2() f3() f4() ### 业务部门B 调用基础平台提供的功能 ### f1() f2() f3() f4()
2)只对基础平台的代码进行重构,其他业务部门无需做任何修改
############### 基础平台提供的功能如下 ############### dic = {"username":"rain"} def check(arg): for i in arg: if arg[i] == "rain": print("用户输入正确") return arg def f1(): check(dic) print("log") print("f1") def f2(): check(dic) print("log") print("f2") def f100(): check(dic) print("log") print("f100") ########调用函数######## f1() f2() f100() ########调用结果######### 用户输入正确 log f1
写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:
- 封闭:已实现的功能代码块
- 开放:对扩展开发
3)如果将开放封闭原则应用在上述需求中,那么就不允许在函数 f1 、f2、f3、f4的内部进行修改代码
def outer(func): def check(): print("log") func() print("end") return check @outer def f1(): print("f1") @outer def f2(): print("f2") @outer def f100(): print("f100") #########调用函数######### f2() #########执行结果######### log f2 end
3、详细讲解装饰器
def outer(func): def inner(): print('berfore') func() print("after") return inner # @ + 函数名 #功能: # 1、自动执行outer函数并且将其f1()的函数名 当做参数执行 # 2、将装饰器函数的返回值,重新赋值给f1() @outer def f1(): print("F1") f1()
对比下面俩图,自己体会
装饰器参数
1、不带参数
def outer(func): def inner(): print('berfore') func() print("after") return inner @outer def f1(): print("F1") #######执行结果######### berfore F1 after
2、带一个参数
####由于f1()需要一个参数,而定义装饰器时并没有给定这个参数,so:在加入装饰器时会报错 def outer(func): def inner(): print("before") func() print("after") return inner # @outer def f1(arg): print(arg) return "传递参数" a = f1("hello ") print(a) ##########执行结果############ #不加装饰器之后 """ hello 传递参数 """ #加装饰器之后报错 """ Traceback (most recent call last): File "E:/PyCharm4.5.2/PyCharm 文件/day4/funct.py", line 366, in <module> a = f1("hello ") TypeError: inner() takes 0 positional arguments but 1 was given """
def outer(func): def inner(arg): print("before") r = func(arg) print("after") return r return inner @outer def f1(arg): print(arg) return "传递参数" a = f1("hello ") print(a) ###########执行结果############ """ before hello after 传递参数 """
3、带二个参数
def outer(func): def inner(arg,kwarg): print("before") r = func(arg,kwarg) print("after") return r #返回f1()的返回值(传递参数) return inner @outer def f1(arg,kwarg): print(arg) print(kwarg) return "传递参数" a = f1("hello","world") print(a) ###########执行结果############ """ before hello world after 传递参数 """
这样一个个添加实在太麻烦啦(动态参数,不要太方便哦!)
#之前学过万能参数(动态参数),用在这里实现太方便啦 def outer(func): def inner(*arg,**kwarg): print("before") r = func(*arg,**kwarg) print("after") return r return inner @outer def f1(*arg,**kwarg): print(arg) print(kwarg) return "传递参数" a = f1() print(a) #####执行结果###### """ before () {} after 传递参数 """ ######################################## a = f1(["alex",11,33],**{"name":"rain"}) print(a) """ before (['alex', 11, 33],) {'name': 'rain'} after 传递参数 """
未完待续!!!