函数语法:
def 函数名 ( [形参列表] ):
‘’‘注释‘’‘
函数体
函数名([实参列表]) #引用说明
注:
1. 不需要说明形参类型,根据值推断实参类型
2. 不需要指定函数返回类型,由函数return语句返回来确定
3. ()在任何地方不能丢
4. 函数体必须保持空格缩进
例:
def add(m,n):
print(m+n)
daa=add(100,1)
print(daa)#没有指定返回类型,默认空类型
函数参数:
1. 位置参数:
def demo(a,b,c): #所有的形参都是位置参数
print(a,b,c)
demo(1,2,3)
demo(2,1,3)
demo(3,1,3,2) #实参与形参个数相同
注:实参与形参个数相同,默认值除外
2. 默认值参数:
def 函数名(…,形参名=默认值):
函数体
注:所有的默认值参数最右边必须为默认值参数的
例 :
def demo(message,times=1):
print((message+' ')*times)
demo('hello') #不给参,则使用第二个参数使用默认值
demo('hello',3) #给参,则使用已有实参什值
3. 关键参数:
关键参数:按照参数名字来传值(实参顺序可以和形参顺序不一致)
def demo(key1,key2,key3=5):
print(key1,key2,key3)
demo(key3=6,key2=5,key1=2)
注:这里的顺序以形参的顺序为准
4. 可变长度参数:
可变长度参数定义(这里指的形参):
*parameter:用接收任意多个位置实参放在一个元组里
def demo(*p):
print(p)
demo(1,2,3)
结果为:(1, 2, 3)
**parameter:接收多个关键参数并将放放字典里
def demo(**p):
print(p)
demo(x=1,y=2,z=3)
结果为:{'x': 1, 'y': 2, 'z': 3}
序列解包
序列解包指的是实参(这里与可变参数相对应),也主是调用含有多个位置参数的函数时,使用列表,元组,集合,字典及其它可迭代对象作为实参时,在实参前加一个或两个*,python自动解包,将其序列分别传递给多个形参变量。例 :
# *
>>> a_list=[1,2,3]
>>> def demo(a,b,c):
print(a,b,c)
>>> demo(*a_list) #序列解包
1 2 3
>>>
# **
>>> b_tuple={'a':1,'b':2,'c':3}
>>> def demo2(a,b,c=5): #这里的c=5只是一个默认值,但会实参取代
print(a,b,c)
>>> demo2(**b_tuple)
1 2 3
>>>
变量的作用域
变量起作用的范围称为变量的作用域
声明全局变量:
global 变量名 #声明全局变量,不能赋值
引用变量并没有赋新值,该变量为隐式的全局变量;在函数有为变量赋值的操作,变量称为隐式的局部变量(除非已用global声明为全局变量)
注:在一个函数中,同变量名局部变量不允许在全局变量的前面
生成器函数
包含yield语句的函数可以用来创建生成器对象,这样的函数也称为生成器函数
yield语句的作用与return的作用相似,从函数中返回值
不同点:return一旦执行会立刻结束函数的运行;执行yield语句返回一个值后,会暂停或挂起后面的代码,下次通过生成器对象_next_()方法、next()、for循环遍历进行索要可以恢复执行(惰性求值)
例:
def f():
a, b = 1, 2
while True:
yield a
a, b = b, a + b
a = f()
for i in range(10):
print(a.__next__(), end=' ')
结果:1 2 3 5 8 13 21 34 55 89
函数应用
冒泡排序:
from random import randint
a_list=[randint(1,100) for i in range(10)] #随机生成10个1-100的整数
print('\t原列表:',a_list)
'''b_list=a_list
b_list.sort() #测试
print('排序后的列表:',b_list)'''
def a_listSort(a_list):
length=len(a_list) #求列表长度
for i in range(length):
for j in range(length-i-1): #-1保证j+1能比较,-i保证最后一个为最大的
if a_list[j]>a_list[j+1]: #相邻的值比较
a_list[j+1],a_list[j]=a_list[j],a_list[j+1] #交换值
return a_list
print('排序后的列表:',a_listSort(a_list))
选择排序:
from random import randint
a_list=[randint(1,100) for i in range(10)]
print('原列表:',a_list)
def selectSort(a_list):
length=len(a_list)
for i in range(length):
for j in range(length):
if a_list[i]<a_list[j]: #一个与所有比较,找最大的或最小的,找到就交换
a_list[j],a_list[i]=a_list[i],a_list[j] # 交换值
return a_list
print('排序后的列表:', selectSort(a_list))
二分查找:
from random import randint
a_list=[randint(1,100) for i in range(10)]
a_list.sort() #升序排列好
print(a_list)
def binarySearch(a_list,value): #列表与值
start=0 #起始坐标
end=len(a_list) #末尾坐标
while start<end:
cen=(start+end)//2 #中间值
if a_list[cen]==value:
return cen
elif value>a_list[cen]:#右边继续查找
start=cen+1
elif value<a_list[cen]:#左边继续查找
end=cen-1
return False
result=binarySearch(a_list,25) #结果
if result!=False:
print('Success',result)
else:
print('no')