Python是个啥-第五章 函数(2)
5.4 函数类型
5.4.1 自定义函数
5.4.2 内置函数
-
进制转换
bin() 将十进制进制转换为二进制
oct() 将十进制进制转换成八进制
int() 将其他进制转换为十进制
hex() 将十进制进制转换为十六进制
v1='0b1110' #二进制
v2='0o1101' #八进制
v3='0x1101' #十六进制
# v4=int(v1,base=2) #2进制转换为10进制
# v4=int(v2,base=8) #8进制转换为10进制
v4=int(v3,base=16) #16进制转换为10进制
print(v4)
-
其他类型
id() #内存地址查看
len() #长度计算
open() #打开文件
range() #范围
type() #类型查看 -
数学相关
abs() #取对值
float() #整形转换成浮点型
max() #找到最大值
min() #找出最小值
sum() #求和divmod(a,b) #除法,获取(商,余数)
pow #指数 2**3 = pow(2,3)
round # round(3.14159,2) 保留小数点几位(有四舍五入功能)
-
输入输出
print() #输出
input() #输入 -
强制转换
tuple() #转换为元组
list() #转换为列表
int() #转换为整形
dict() #转换为字典
str() #转换为字符串
bool() #转换为布尔型
set() #转换为集合 -
编码相关
chr # 将10进制数字转换成unicode编码中的对应字符串
v=chr(20013) print(v) #中
ord # 将unicode编码中的对应字符串转换成10进制数字
v=ord('中') print(v) #20013
-
进制转换
bin() 将十进制进制转换为二进制
# IP地址转换为二进制 172.168.10.1 >> 10101100.10101000.00001010.00000001 source='172.168.10.1' new_source=source.split('.') #转换为列表 new_list=[] for i in range(4): a1=bin(int(new_source[i])) a=a1.replace('0b','').zfill(8) #字符串补齐:不足的用0补齐8位 new_list.append(a) result='.'.join(new_list) print(result) #10101100.10101000.00001010.00000001
oct() 将十进制进制转换成八进制
int() 将其他进制转换为十进制
hex() 将十进制进制转换为十六进制v1='0b1110' #二进制 v2='0o1101' #八进制 v3='0x1101' #十六进制 # v4=int(v1,base=2) #2进制转换为10进制 # v4=int(v2,base=8) #8进制转换为10进制 v4=int(v3,base=16) #16进制转换为10进制 print(v4)
-
高级内置函数
filter/map/reduce
-
filter 过滤
# filter() #将列表过滤后返回新列表 v1=[1,2,'aaa',4,5] # def func(x): # if type(x) == int: # return True # v2=filter(func,v1) # print(list(v2)) ########### # def func(x): # return True if type(x) == int else False # v3=filter(func,v1) # print(list(v3)) # v4=filter(lambda x:True if type(x)==int else False,v1) # print(list(v4))
-
map 映射
v1=[1,2,3,4,5] # # map() #将列表处理后一一对应返回新列表 # #第一个参数必须是函数, # #第二个参数必须是可迭代的类型(可被for循环),元素会被一一处理 # #将每一个函数执行的结果保存到新的列表中,并返回 # def func(arg): # return arg+100 # v2=map(func,v1) # print(list(v2)) # # v2=map(lambda x:x+100,v1) # print(list(v2))
-
reduce 得到一个结果
v1=[1,2,3,4,5] def func(x,y): return x*y # reduce函数 #将列表返回一个值 import functools v1=[1,2,3,4,5] result=functools.reduce(lambda x,y:x*y,v1) print(result)
5.5 高阶函数
- 对函数进行赋值
- 把函数当做参数传递
5.5.1 函数闭包
通过函数的嵌套,把值保留起来,方便以后调用。
def func(name):
def inner():
print(name)
return inner
v=func('a') #v=inner 执行v() a
v=func('d') #v=inner 执行v() d
5.5.2 lambda表达式(匿名函数)
- 格式:lambda 参数1,参数2:执行代码。
- 只能写一行。
- 不能定义变量。
- 默认结果给return返回。
list1=[]
func1=lambda :print('func')
func2=lambda a1:a1
func3=lambda a1,a2:a1+a2
func4=lambda *args,**kwargs:len(args)+len(kwargs)
func5=lambda a1,a2:'%s is bigger then %s'%(a1,a2) if a1>a2 else '%s is bigger then %s'%(a2,a1)
func6=lambda a1:list1.append(a1)
v1=func1() #None
v2=func2(2) #2
v3=func3(2,3) #5
v4=func4(1,2,3,4,k1=21,k2=12) #6
v5=func5(101,-12) #101 is bigger then -12
v6=func6('Alice') #None
print(v1,v2,v3,v4,v5,v6,list1)
5.5.3 函数作为参数应用
- 函数赋值
def func():
pass
func_new=func
func_new() # 等于func()
func_list=[func,func,func,func]
func_list[0]() # 等于func()
- 函数可以当参数进行传递
def func(arg):
v1=arg()
print(v1)
def show():
print(999)
func(show) # None
5.5.4 函数嵌套
在一个函数中定义了另外一个函数
嵌套-->函数缩进
name1='allen' #全局
def func():
global name1 #改变全局
name1='Allllll'
name='Allllll'
def inner():
nonlocal name #作用域于func函数
name='Allen'
inner()
print(name)
func() #Allen
print(name1) #Allllll
5.6 装饰器
python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:
- 实质: 是一个函数
- 参数:是你要装饰的函数名(并非函数调用)
- 返回:是装饰完的函数名(也非函数调用)
- 作用:为已经存在的对象添加额外的功能
- 特点:不需要对对象做任何的代码上的变动
5.6.1 装饰器意义
在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能。
5.6.2 装饰器的写法
def x(func): #装饰器函数
def y(*args,**kwargs):
ret=func()
return ret
return y
@x #加载装饰器
def index(): #需要装饰的函数
pass
@x
def manage(): #需要装饰的函数
pass
index() #在执行函数时自动触发装饰器x
#流程解释:在执行index()函数时,先将index函数的内存地址当做参数传递给x函数,即x(index),然后将x函数的执行结果重新赋值给index函数,即index=y函数,最后执行index()=y()
def 外层函数(参数):
def 内层函数(*args,**kwargs): #参数是为了被装饰函数执行时传参用
return 参数()
return 内层函数
5.6.3 装饰器的应用场景
想要为函数扩展功能时,可以选择装饰器。
@外层函数
def index():
pass
index()
5.7 案例
- 写函数,计算列表中有多少数字,打印列表中数字的个数
def calc(data):
#计算有几个数字
count=0
for i in data:
if type(i) == int:
count +=1
return count
print(calc([1,'23','9fe','d8fe1','21']))
- 对文件中的信息格式化输出
datas=open('a.log','r',encoding='utf-8')
# list1
def list1(data):
newlist = []
for i in data:
newlist.append(i.strip())
return newlist
print(list1(datas))
# ['alice|123|20', 'madan|123|28', 'jodan|123|52']
#list2
newlist=[]
def list2(data):
for i in data:
newlist.append(i.split())
return newlist
print(list2(datas))
# [['alice|123|20'], ['madan|123|28'], ['jodan|123|52']]
# list3
data1 = []
data2 = {}
def list3(data):
for i in data:
new_i=i.strip().split('|')
data2.update({'name':new_i[0],'pwd':new_i[1],'age':new_i[2]})
data1.append(data2)
return data1
print(list3(datas))
# [{'name': 'jodan', 'pwd': '123', 'age': '52'}, {'name': 'jodan', 'pwd': '123', 'age': '52'}, {'name': 'jodan', 'pwd': '123', 'age': '52'}]
- 一个列表中有10000个元素,用户输入页码,分页显示,每页显示10个元素
with open('百家姓','r',encoding='utf-8') as f:
content=f.read()
#随机创建10000个元素的列表
import random
USER_LIST=[]
for i in range(1,10001):
age = random.randint(15, 88)
name = random.sample(content, 3)
name = "".join(name)
# email=str(random.randint(0,9))
email = '2'
for i in range(6):
email += str(random.randint(0, 9))
tmp={'Name':name,'Age':age,'Email':'%s@qq.com'%(email)}
USER_LIST.append(tmp)
#用户输入检查
flag=True
while flag:
choice=input('查询页面[1-%s]:'%len(USER_LIST))
if choice.isdigit():
c_num = int(choice)
flag=False
p_num, num = divmod(c_num, 10) # 获取分页页码
if num > 0:
s_num = p_num * 10 + 1
e_num = s_num + 10
elif num == 0:
s_num = p_num * 10 - 9
e_num = s_num + 10
for i in range(s_num, e_num):
if i == c_num:
print("\033[5;31;40m# 第%s页:%s\033[0m" % (i, USER_LIST[i - 1])) # 高亮显示输入页面
else:
print('# 第%s页:%s' % (i, USER_LIST[i - 1]))
else:
print('输入错误,请重试!')