python函数
1、函数:
函数就是一个功能,一个方法,作用简化代码
2、定义一个函数:
def 函数名():
函数体
函数必须得调用才会执行
调用函数:
函数名()
1 def say(): #定义函数
2 print('这是一个函数') #函数体
3
4 say() #调用函数
3、参数:
def say(形参): #形参,形式参数,变量
print('%s哈哈哈'%name)
say(实参) #传进去的值是实参,实际参数
1 def say(name): #定义函数,有形参
2 print('%s在学习函数'%name) #函数体
3 say('saki') #调用函数,传参数
必填参数,位置参数
1 def say(name,sex): #定义函数,两个形参
2 print('%s在学习函数 sex:%s'%(name,sex)) #函数体
3 x='saki' #可以定义两个变量
4 y='女'
5 say(x,y) #调用函数,传变量参数
非必填参数,默认值参数,添加默认值,不传就取默认值
1 def say(name,sex='男'): #定义函数,两个形参,给其中一个形参填写默认值
2 print('%s在学习函数 sex:%s'%(name,sex)) #函数体
3 x='saki' #可以定义两个变量
4 y='女'
5 say(x) #调用函数,传变量参数,只传一个
4、小练习1:
写一个计算器,存款有8000元,每个月赚1000元,一共开13个月的工资,现要求把存款和13个月工资加起来。
1 def calc(a,b): #定义一个函数,定义两个参数
2 res = a*b #计算13个月总工资
3 return(res) #返回res结果
4 cur_money=8000 #存款
5 nx=calc(1000,3) #年薪
6 calc(nx+cur_money)#年薪+存款
5、return
在函数里面的变量全都是局部变量,它只能在函数里面用,函数执行结束那么就没有这个变量了,所以我们需要返回,使用return关键字,调用函数后,返回结果。
函数在不写return的时候,会返回None。
函数里面如果碰到return,函数立即结束
1 def my():
2 for i in range(100):
3 print(i)
4 if i==2:
5 return
6 print(my())
结果:0 1 2 None
7、小练习2:
校验输入的字符串是否是一个合法的小数的程序
思路:
①合法的小数有 正小数,负小数 0.12 -12.3
②只有一个小数点,判断小数点个数
③正小数的情况下:小数点左边和右边都是整数
④负小数的情况下:小数点右边是一个整数,左边必须以负号开头,只有一个负号,并且是整数,使用切片[1:]
1 def check_float(s): #定义一个函数,定义一个参数
2 s=str(s) #将传进来的值全都改为字符串
3 if s.count('.')==1: #判断是否只有一个小数点
4 s_list=s.split('.') #只有一个小数的时候,对它进行分割
5 left=s_list[0] #取小数点左边的数
6 right=s_list[1] #取小数点右边的数
7 if left.isdigit() and right.isdigit(): #判断如果left和right 都是数字(正小数)
8 return True
9 if left.startswith('-') : #判断left是否以负号开头并且是否只有一个负号(负小数)
10 if left[1:].isdigit() and right.isdigit(): #判断left下标1开始到结束是否都是整数,并且判断右边是否都是整数,可以跟上一行写在一起
11 return True
12 return False
13 print(check_float(-3.5))
14 print(check_float(-50.3))
15 print(check_float('-s.5'))
16 print(check_float('-5.w5w8'))
结果:
8、文件操作
1 def my_file(name,content=None): #定义一个函数,传两个形参,文件名和文件内容
2 with open(name,'a+') as f: #打开文件,以a+的形式打开
3 f.seek(0) #将指针移到最前面的位置
4 if content: #判断content是否传值
5 f.write(content) #content有内容就将它写进文件
6 else:
7 return f.read() #如果没有传值,读取文件内容
8 str='aaa' #定义一个字符串
9 print(my_file('email.txt',str)) #调用函数,传值将内容写入文件,返回None,没传值,读取文件内容
9、FILE_NAME='good.json' 全部大写字母表示常量
10、局部变量和全局变量
在函数里面定义的变量都是局部变量,除了函数之外的都不能直接使用
在文件最上面定义的这个变量就是全局变量
1 name='小黑' #定义全局变量 2 def test(): #定义一个函数 3 global name #声明修改全局变量 4 name='小白' #修改name的值 5 print(name) 6 test() #调用函数
11、小练习1
1 money=500 #定义变量money=500 2 def test(consume): #4、进入该函数 3 return money-consume #5、money=500减掉consume=500,所以等于0 4 def test1(money): #2、进入该函数 5 return test(money)+money #3、调用test(),参数值为500 6、test(money)的值为0+money(500) =500 6 money=test1(money) #1、首先调用test1()函数,传入money=500 7 print(money) #7、所以最后结果为500
12、小练习2
这个练习的结果是什么?
1 def test(): 2 global a 3 a=5 4 def test1(): 5 c=a+5 6 return c 7 res=test1() 8 print(res)
练习的结果报错,提示'a'没有被定义。test()这个函数并没有被调用,a没有被定义,程序找不到a
所以需要调用一下test(),让它把全局变量定义了,正确书写如下:
1 def test(): 2 global a 3 a=5 4 def test1(): 5 c=a+5 6 return c 7 test() #调用test()函数 8 res=test1() 9 print(res)
13、小练习3
这个练习的结果是什么?
1 d={'name':'abc'} 2 def my(): 3 d['sex']=29 4 print(d) 5 my() 6 print(d)
字典和list,这种可变变量,不需要用global来声明,就可以直接改了
14、可变参数
可变参数,参数组,参数多的情况下可以使用*args(args为参数名,可修改,一般都使用args)
1 def send_mail(*email): #参数名前加*号 2 print('email..',email) 3 send_mail('niu@163.com') 4 send_mail('niu@163.com','lxy@qq.com','zyf@126.com') 5 send_mail()
问题:1、是否必填? 非必填
2、有没有参数个数限制? 没有限制
结果:
1 def run(name,age=29,*args): 2 print(name) 3 print(age) 4 print('args..',args) 5 run('lcx',29,'beijing','tiantongyuan')
结果:
可以看到,给了name的值和age的值,后面两个值没有对应的参数接收,于是全部都归到*args里
15、关键字参数
1 def op_db(ip,port,db,user,passwd,sql): 2 print('链接mysql操作数据库') 3 pass 4 5 op_db('192.168.1.12',3306,'xxx','ddd','ddd','ddd')#这种必须按照固定位置传参数 6 op_db(db='jxz',ip='192.168.1.1',sql='selecr',port=3306,user='xxx',passwod='aaa') #这时候用到关键传参,不需要按照顺序传参,指定哪个关键字传哪个关键字
16、参数
参数分为:
位置参数:必填参数
默认值参数:非必填参数
可变参数:非必填参数,不限制参数个数
关键字参数:非必填参数,将值都放在字典里
四种参数如果同时使用,必须按照由上到下的顺序进行传值,否则会报错。
17、**kwargs
**kwargs:两个*号,不限制参数个数,并且将值都放在字典里
1 def my(name,sex='男',*args,**kwargs): 2 print(name) 3 print(sex) 4 print(args) 5 print(kwargs) 6 my('xiaohei','hhh','args','args2',k='1',k2='v2')
18、递归
递归:函数自己调用自己,递归最多循环999次,超过999次就会报错
1 count=0 2 def add(): 3 global count 4 count+=1 5 print('hhh',count) 6 add() 7 add()
用递归的话,必须得有一个明确的结束条件
1 def my2(): 2 num=input('输入一个数字:') 3 num=int(num) 4 if num%2!=0: 5 print('请输入偶数') 6 return my2() 7 else: 8 return 9 my2()
19、随机取6个1-33的值,个位数前面补0
方法1:
1 import random 2 res=random.sample(range(1,34),6)#range(1,34) 产生一个从1-33的list,不包括34,random.sample 从一个list里面取几个元素 3 print(res) 4 for i in range(len(res)): 5 res[i]=str(res[i]).zfill(2) 6 print(res)
方法2:
列表推导式,列表生成式
1 import random 2 res=random.sample(range(1,34),6) 3 print(res) 4 res=[str(i).zfill(2) for i in res] 5 print(res)
20、生成1000以内的偶数
1 res=[i for i in range(0,1001,2)]#从0开始到1000,步长为2 2 print(res)