Python函数及函数应用(第五章)

函数语法:

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')
发布了59 篇原创文章 · 获赞 3 · 访问量 4768

猜你喜欢

转载自blog.csdn.net/CDZAllier/article/details/100898987