Python编程高阶函数
#!/usr/bin/env python
# coding: utf-8
lambda表达式
# 又被称之为匿名函数
#
# 格式 lambda 参数列表: 函数体
#
# In[1]:
def add(x, y):
return x + y
print(add(3, 4))
# In[3]:
# 简单的函数采用这个
add_lambda = lambda x, y : x + y
add_lambda(3, 4)
三元运算符
# In[4]:
condition = True
print(1 if condition else 2)
# In[5]:
condition = False
print(1 if condition else 2)
map函数的应用
# In[8]:
list1 = [1, 2, 3, 4, 5]
r = map(lambda x : x + x, list1)
print(list(r))
# In[10]:
m1 = map(lambda x, y: x * x + y, [1,2,3,4,5], [1,2,3,4,1])
print(list(m1))
filter 过滤器
# In[16]:
def is_not_none(s):
return s and len(s.strip()) > 0
list2 = {' ', '', 'hello', 'greedy', None, 'ai'}
result = filter(is_not_none, list2)
print(list(result))
reduce 函数
# In[19]:
from functools import reduce
f = lambda x, y: x + y
r = reduce(f, [1, 2, 3, 4, 5], 10)
print(r)
列表推导式
根据已有的列表推导出新的列表
# In[26]:
list1 = [1, 2, 3, 4, 5, 6]
f = map(lambda x: x+x, list1)
print(list(f))
list2 = [i + i for i in list1]
print(list2)
list3 = [i**3 for i in list1]
print(list3)
# 有选择性的筛选
list4 = [i*i for i in list1 if i > 3]
print(list4)
集合推导式
# In[28]:
list1 = {1, 2, 3, 4, 5, 6}
list2 = {i + i for i in list1}
print(list2)
list3 = {i**3 for i in list1}
print(list3)
# 有选择性的筛选
list4 = {i*i for i in list1 if i > 3}
print(list4)
字典推导式
# In[36]:
s = {
'张三': 20,
'李四': 15,
'王五': 31
}
# 拿出所有的key,变成列表
s_key = [key + 'aaa' for key, value in s.items()]
print(s_key)
# key 和 value 颠倒
s1 = {value: key for key, value in s.items()}
print(s1)
# 只拿出符号条件的值
s2 = {key: value for key, value in s.items() if key == '李四'}
print(s2)
闭包:一个返回值是函数的函数
# In[39]:
# 调用后打印当前的时间
import time
def runtime():
def now_time():
print(time.time())
return now_time
f = runtime()
# f()
# In[40]:
f()
# In[58]:
get_ipython().system('type data.csv')
# In[60]:
# 读出一个文件中带有某个关键字的行
def make_filter(keep): # keep = 8
def the_filter(file_name): # file_name = data_csv 这个文件
file = open(file_name) # 打开文件
lines = file.readlines() # 读取出来所有的文件内容
file.close() # 关闭文件
filter_doc = [i for i in lines if keep in i] # 过滤文件内容
return filter_doc
return the_filter
filter1 = make_filter('c') # 这一行调用了make_filter函数,接受了the_filter函数作为返回值
# 也就是说这里的filter1 就等于函数 the_filter
filter_result = filter1('data.csv')
print(filter_result)
装饰器/语法糖/注解
# In[64]:
# 获取函数的运行时间
import time
def runtime(func):
def get_time():
func()
print(time.time())
return get_time
@runtime
def student_run():
print('学生跑!')
student_run()
如果函数有参数怎么解决——有参数的装饰器
# In[81]:
def runtime(func):
def get_time(*args):
func(*args)
print(time.time())
return get_time
@runtime
def student_run(i, j):
print('学生跑!')
@runtime
def student_run1(i):
print('学生1跑!')
student_run(1, 2)
student_run1(1)
# 关键字参数 key = value
关键字参数问题
def runtime(func):
def get_time(*args, **kwargs): #依次解决多参数,关键字参数问题
func(*args, **kwargs)
print(time.time())
return get_time
@runtime
def student_run(i, j):
print('学生跑!')
@runtime
def student_run1(*args, **kwargs):
print('学生1跑!')
@runtime
def student_run2():
print('学生2跑!')
student_run(1, 2)
student_run1(5, 3, i = 1, j = 2)
student_run2()
# 关键字参数 key = value
作业:开发一个语法糖,实现参数的类型准确性.
在python中,大家都知道python的数据类型是弱类型,比如说函数只允许传字符串
关键字参数问题,小作业的解答
def runtime(func):
def get_time(*args, **kwargs): #依次解决多参数,关键字参数问题
for i in args:
if not isinstance(i, str):
print('NO!!')
print(type(kwargs))
for i, j in kwargs.items():
if not isinstance(j, str):
print('NO!!')
func(*args, **kwargs)
print(time.time())
return get_time
@runtime
def student_run(i, j):
print('学生跑!')
@runtime
def student_run1(*args, **kwargs):
# if not(type(args)== str and type(kwargs) == str):
# exit('NO!')
print('学生1跑!')
@runtime
def student_run2():
print('学生2跑!')
student_run(1, 2)
student_run1(5, 3, i = 1, j = 2)
student_run2()
# 关键字参数 key = value