函数基础
函数定义
函数 也就是方法、功能,说白了,函数就是把一堆代码组合到一起,变成一个整体。 函数的作用:提高代码的复用性
注:函数不调用不会被执行
练习:下面代码运行结果是什么?
def test(): global a a = 5 def test1(): c = a+5 return c res = test1() print(res)
解析:很多人觉得是10,因为test()函数中,设置a为全局变量,且a的值为5,所以test1()函数中引用全局变量a=5,所以c=10,似乎很有道理,然而。。。。
运行报错,a没有定义,原因是test()木有被调用,木有被调用,木有被调用,,啊哈哈哈,知道函数调用才被执行的重要性了吧
全局变量、局部变量
函数内部的变量是局部变量,只对本函数使用,函数外部的变量是全局变量,对所有函数使用------可以通过global,将局部变量声明成全局变量
c=10#全局变量 def test(): global a#通过global,将局部变量a声明成全局变量 a = 5 b=2#局部变量,只在 test()函数中有效 d=a*b*c
return d def test1(): m = a+c return m res1=test() res2 = test1() print(res1,res2) #100 15
参数
形参、实参、位置参数、默认值参数--位置参数,必填参数,默认值参数,不是必填的
def campare(a,b=5):#形参 if a>=b: return a else: return b res=campare(100,1000)#实参,a位置参数,必填,是第一个参数,传参要位置对应 res1=campare(4)#b为默认值参数,非必填项,如果不填,取默认值, 如果传参,取传的参数值 print(res,res1) #1000 5
可变参数
def test(a,b,*args):#可变参数 print('a',a) print('b',b) print(args[2]) test(2,3,'123','456','789','sfsdf')#位置调用 #a--2 b--3 args[2]---'789' #print(args)返回的是一个元组,包含除了a,b对应的值之外的所有值,可以通过下标访问
关键字参数
def test2(a,**kwargs):#**kwargs接受的值k—v键值对 print(a) print(kwargs)#返回一个字典 test2(a=1,name='lsas',age=18,addr='beijing')#必须要用关键字这种方式调用,否则报错,不是必填的 #1 #{'addr': 'beijing', 'age': 18, 'name': 'lsas'}
返回值
return ---如果函数没有写return的话,返回值是None,return不是必须写的,需要获取到函数的返回结果再写。
注:return 立即结束函数
递归---自己调用自己
用递归能实现的用循环都能实现,最后别递归,效率不高,最多能递归999次
def test1(num): num=int(input('输入一个数字:')) if num%2==0: return True print('不是偶数,请重新输入!') return test1()#递归调用 print(test1())
内置函数
map、filter、zip
#map 接收两个参数,第一个函数名,第二个可迭代对象,返回包含函数作用于可迭代对象的每个参数后的函数返回值组成的新列表 def func(a): if a%2==0: return True else: return False nums=[x for x in range(11)] #生成0-10的数组 res=map(func,nums) print(list(res)) #res是一个map对象,将其转化成list才能打印 #结果:[True, False, True, False, True, False, True, False, True, False, True] #filter过滤函数,对函数的返回值进行判断,为假的过滤掉,返回的是为真的原迭代对象的值,并不是函数的返回值 res2=filter(func,nums) print(list(rest2)) #[0, 2, 4, 6, 8, 10] #zip 将多个可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表,如果迭代对象中的个数不同则取少的 ids=[1,2,3,4,0,78,9] names=['wang','le','le'] print(list(zip(ids,names))) #结果:[(1, 'wang'), (2, 'le'), (3, 'le')] for id,name in zip(ids,names): print(id,name) ''' 结果: 1 wang 2 le 3 le '''
zip(*zipped) # 与 zip 相反,可理解为解压,返回二维矩阵式 [(1, 2, 3), ('wang','le','le')]
其他常用内置函数
#强制类型转化int()input()print()type()len() # print(sorted(ids))#升序 # print(sorted(ids,reverse=True))#降序 # print(round(1.23243,2))#保留几位小数 # print(dir(a))#打印a可以引用的所有方法,不用看带下划线的 # print(chr((67)))#打印数字对应的ascii码 # print(ord(('A')))#打印字符串对应的ascii码 # print(divmod(8,3))#取模 # print(all([1,2,3,4,0,1]))#判断可迭代对象里的值是否都为真 # print(any([1,2,3,4]))#判断可迭代对象里的值是否有一个为真 # print(bin(100))#十进制转二进制 # a=bin(100) # print(a.replace('0b','')) # print(eval())#执行python代码。只能执行简单的,定义数据类型和运算 # code = '1+1' # code2 ="{'name':'lsi'}"#将字符串转换成字典 # code3 ='def f (a):pass' # print(eval(code3)) # code ='''def a():print('aa')'''#应用在线写代码,传入的是字符串,通过exec运行 # print(exec(code))
函数即变量
def add(): print('添加商品') def view(): print('查看商品') def delete(): print('删除商品') choice = input('请输入选择 1、2、3、').strip() menu = { '1':add, '2':view, '3':delete } if choice in menu: menu[choice]() #适合用于函数没有参数,或者参数是一样的情况下。 else: print('输入错误')