函数
函数(方法,功能)
函数的作用提高代码的复用性,让代码更简介
简单定义一个函数 使用def
def sayhello(): # 函数名 print('hello') #函数体 #函数不调用是不会被执行的 sayhello() #调用函数
函数的参数
1.形参和实参
def calc(a,b): #a,b 叫做形参,形式参数 res = a * b print('%s * %s =%s'%(a,b,res)) calc(7,8) #7,8 叫做实参 实际参数
用return的写法
def calc(a,b): return a * b print(calc(7,8))
2.位置参数
按照参数的位置来传参,calc这个函数中,a和b就是位置参数,是必传的,没有会报错
def calc(a,b): #位置参数,必填,不填会报错missing 2 required positional arguments print('%s * %s = %s'%(a,b,a*b)) calc(7,8)
3.默认值参数
默认值参数是非必填的,如果填了参数,取的是填的参数,没填去的是None 如果使用默认值参数的话,必须放在位置参数后面定义。
def op_file(file_name,conent=None): # conent默认值参数,非必填参数 #默认值参数 f = open(file_name,'a+',encoding='utf-8') f.seek(0) if conent: #不为空代表写 f.write(conent) f.flush() else: #为空代表读 all_users = f.read() return all_users #调用完函数之后,返回什么结果 f.close() res = op_file('a.txt','hh') #hh 就是自己填的参数 print(res)
3 不固定参数
参数组用*接收
可以传多个参数,参数非必填的,返回的是一个元祖
def syz(*args): #参数组 *args print(args) syz() syz('niuhanyang','123',123) syz('ls','sdf')
关键字参数
关键字参数使用**来接收
可以传多个参数,参数非必填的,返回的是一个字典
def syz2(**kwargs): #关键字参数 print(kwargs) syz2() syz2(name='lily',age='23') #{'name':'lily','age':'23'} syz2(name='lily',age='23',addr='china') syz2('lily') #报错
函数的返回值 return
每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None,函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元组中,返回的是一个元组
def calc(x, y): # 这个就是定义了一个有返回值的函数 c = x * y return c, x, y res = calc(5, 6) # 把函数的返回结果赋值给res print(res) #(30,5,6)
返回值作用:
1、把函数处理的结果返回回来,供后面的程序用。
2、结束函数,函数里面遇到return,函数会立即结束
def op_file(file_name,conent=None): #默认值参数 f = open(file_name,'a+',encoding='utf-8') f.seek(0) if conent: #不为空代表写 f.write(conent) f.flush() else: all_users = f.read() return all_users #调用完函数之后,返回什么结果 f.close() #res = op_file('a.txt') #默认值参数为空,就是读 #xiaomeng res = op_file('a.txt','龚丽娜') #默认值参数不为空,就是写 返回None #默认值参数 print(res)
函数遇到return 立即结束
def hh(): for i in range(5): print(i) if i ==3: return hh() # 0 1 2 3
import string def check(pwd): #密码规则 长度6-11位 包含字母和数字 if len(pwd)>5 and len(pwd)<12: if set(pwd) &set(string.ascii_letters)and set(pwd)&set(string.digits): print('密码合法') else: print('密码不合法') else: print('密码不合法') res = check('asds34') #密码合法
#函数里面没有return的话,默认返回None,return 不是必须写的 print(res) # None
局部变量和全局变量
常量:
一个不变的值,通常用大写字母定义
PORT = 3306 #常量 FLIENAME = 'user.txt'
局部变量:
函数里面定义的变量,都是局部变量,只要出了函数就不能用了
name = '小萌' #全局变量 def sayName(): name = '小伟' #局部变量 print('name1',name) #name1 小伟 sayName() print('name2',name) # name2 小萌
全局变量:
全局变量的意思就是在整个程序里面都生效的,在程序最前面定义的都是全局变量,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。
name = '小萌' #全局变量 如果要改全局变量的话,先声明一下,你修改值是全局变量 def sayName(): global name #global 修改 name = '小伟' print('name1',name) #name1 小伟 sayName() print('name2',name) #name2 小伟
最好少用全局变量的原因:
(1) 不安全,因为所有人都可以改
(2) 全局变量它会一直占着内存
递归
递归 函数自己调用自己 递归效率不高,少用递归,递归最多999次
def test1(): num = int(input('please enter a number:')) if num%2==0:#判断输入的数字是不是偶数 return True #如果是偶数的话,程序就退出了,返回true print('不是偶数请重新输入!') return test1()#如果不是偶数的话继续调用自己,输入值 print(test1())#调用test
函数返回多个值,2中写法
1.函数如果返回多个值的话,他会把这几个值放在一个元祖里面
2.函数如果返回多个值的话,也可以用多个变量来接收
#1.函数如果返回多个值的话,他会把这几个值放在一个元祖里面 def say(): num1 = 1 num2 = 2 num3 = 3 return num1, num2, num3 res = say() print(res) #(1,2,3)
#2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = 1 num2 = 2 num3 = 3 return num1, num2, num3 res1,res2,res3 = say() print(res1) #1 print(res2) #2 print(res3) #3
匿名函数
用lamdba定义匿名函数,匿名函数,这个功能很简单,只用1次
res = lambda x:x+1 #冒号后面是函数体,也就是函数的处理逻辑;冒号前面的是返回值 print(res(1))
列表生成式
l = [i for i in range(1,101,2)]
列表生成式,只能用在列表中
先写循环,再把循环里的i拿出来,可以做一些简单的操作(补零、转换为字符串等)
import random red_num = random.sample(range(1,34),6) # new_num = [] # for num in red_num: # # print(num) num 是int类型 # tmp = str(num).zfill(2) #补2位 # new_num.append(tmp) new_num = [str(num).zfill(2) for num in red_num] #列表生成式 print(new_num) #['18', '22', '04', '09', '28', '33'] l =[i for i in range(1,101,2)] #列表生成式 生成100以内的奇数 print(l)
三元运算符
a = 5 b = 4 if a>b: c =a else: c = b c = a if a>b else b #三元表达式 print(c) 5
声明入参格式
仅仅是为了代码易读,并不会强制转换类型
def my(name:str):#告诉别人name是str,但不会强制转化,l:list告诉别人传入是list print(name) my('hello') my(['123',123])#入参是list也可以,['123', 123]