《疯狂Python》学习第8课——函数和lambda表达式(1)

第5章函数和lambda表达式

5.1 函数入门

5.1.1 理解函数

    函数是执行特定任务的一段代码,程序通过将一段代码定义成函数,并为该函数指定一个函数 名,这样即可在需要的时候多次调用这段代码。因此,函数是代码复用的重要手段。 学习函数需要 重点掌握定义函数、调用函数的方法。
    lambda表达式可作为表达式、函数参数或函数返回值,因此使用 lambda 表达式可以让程序更加简洁。
    函数三要素:

  • 函数需要几个关键的需要动态变化的数据,这些数据应该被定义成函数的参数。
  • 函数需要传出几个重要的数据(就是调用该函数的人希望得到的数据),这些数据应该被 定义成返回值。
  • 函数的内部实现过程。

5.1.2 定义函数和调用函数

    定义函数基本语法:
def   函数名(形参列表)
        //零条到多条可以执行的语句
         [return [返回值]]
    Python 声明函数必须使用 def关键字,对函数语法格式的详细说明如下:

  • 函数名:函数名只要是一个合法的标识符即可
  • 形参列表: 用于定义该函数可以接收的参数。形参列表由多个形参名组成,多个形参名之 间以英文逗号(,)隔开。 一旦在定义函数时指定了形参列表,调用该函数时就必须传入到 应的参数值一一谁调用函数,谁负责为形参赋值。
        函数执行过程中,按照函数体中语句的先后顺序进行执行。代码示例:
def my_max(x,y):
    z= x if x>y else y
    return z

def say_hi(name):
    print("====正在执行say_hi程序====")
    return name + ',您好'
a=6
b=9
result=my_max(a,b)
print("result:",result)
print(say_hi('刘德华'))

输出结果:

result: 9
正在执行say_hi程序
刘德华,您好

    在函数体中使用 return 语句可以显式地返回一个值, return 语句返回的值既可是有值的变量, 也可是一个表达式。

5.1.3 定义函数和调用函数

    在实际的编程过程中可以通过使用help() 函数查看指定函数的帮助信息,程序可以为自己的函数编写说明文档,只要把一段字符串放在函数声明之后、函数体之前,这段 字符串将被作为函数的部分,这个文档就是函数的说明文档。
    程序既可通过 help()函数查看函数的说明文档,也可通过函数的_doc_属性访问函数的说明文挡。代码文档。

def my_max(x,y):
    '''
    输出两个数中较大的一个
    :param x:
    :param y:
    :return:
    '''
    z= x if x>y else y
    return z
help(my_max)
print(my_max.__doc__)

输出结果:

Help on function my_max in module main:
my_max(x, y)
输出两个数中较大的一个
:param x:
:param y:
:return:

输出两个数中较大的一个
:param x:
:param y:
:return:

5.1.4 多个返回值

    如果程序需要有多个返回值,则既可将多个值包装成列表之后返回,也可直接返回多个值。 如果 Python 函数直接返回多个值, Python 会自动将多个返回值封装成元组。 代码示例:

def sum_and_avg(list):								
    sum=0
    cou=0
    for e in list:
        if isinstance(e,int) or isinstance(e,float):
            cou += 1
            sum += e
    return sum,sum/cou
my_list=[15,20,12.2,'a',-10]
tp=sum_and_avg(my_list)
print(tp)
x,y=sum_and_avg(my_list)
print(x,y)

其中可使用 Python提供的序列解包功能, 直接使用 多个变量接收函数返回的多个值。

5.1.5 递归函数

    在一个函数体内调用它自身,被称为函数递归。 函数递归包含了一种隐式的循环, 它会重复执行某段代码,但这种重复执行无须循环控制。
    例如 己知有一个数列:f(0) = 1 ,f(1)=4,f(n + 2) = 2*f(n+1) +f(n), 其中 n 是大于0的整数,求f(10)的值。
代码示例

def fn(n):
    if n == 0:
        return 1
    elif n== 1:
        return 4
    else:
        return 2*fn(n-1)+fn(n-2)
print(fn(10))

    对于 fn(10),即等于 2 * fn(9) + fn(8),其中 fn(9)又等于 2 * fn(8) + fn(7)……依此类推,最终会计算到 fn(2)等于 2 * fn(l) + fn(0), 即 fn(2)是可计算的,这样递归带来的隐式循环就有结束的时候, 然后一路反算回去,最后就可以得到fn(10)的值。
    当一个函数不断地调用它自身时,必须在某个时刻函数的返回值是确定的,即不再调用它自身:否则,变成了无穷递归,类似于死循环。 因此,在定义递归函数时有一条最重要的规定:递归一定要向己知的方向进行。 例如:己知有一个数列:fn(20) =1,fn(21)=4,fn(n + 2) = 2 *fn(n+1) +fn(n),求fn(10)。代码示例:

def fn(n):
    if n == 20:
        return 1
    elif n== 21:
        return 4
    else:
        return fn(n+2)-2*fn(n+1)
print(fn(10))

    从上面的 fn()函数来看,当程序要计算 fn(l0)的值时,fn(10)等于fn(12)- 2 * fn(ll),而 fn(11) 等于 fn(13)-2 * fn(l2)……依此类推,直到 fn(l9)等于 fn(2l)-2 * fn(20),此时就可以得到 fn(19) 的值,然后依次反算到 fn(10)的值。这就是递归的重要规则:
    对于求fn(10)而言,如果 fn(0)和fn(1) 是己知的,则应该采用 fn(n) = 2 * fn(n - 1) + fn(n-2)的形式递归,因为小的一端已知;
    如果 fn(20) 和fn(21)是己知的,则应该采用 fn(n) = fn(n+2) - 2*fn(n+1)的形式递归,因为大的一端已知。
    只要在一个函数的函数体中调用了函数自身,就是函数递归。递归一定要向己知方向进行。

5.2函数的参数

在定义Python函数时可以定义形参,形参必须要等到调用时才能确定真正的参数,即谁调用函数,谁负责传入参数值。

5.2.1 关键字(keyword)参数

    按照形参位置传入的参数被称为位置参数。如果使用位置参数的方式来传入参数值,则必须严格按照定义函数时指定的顺序来传入参数值:
    如果根据参数名来传入参数值,则无须遵守定义形参的顺序,这种方式被称为关键字(keyword)参数。代码示例:

def grith(width,height):
    print("width:",width)
    print("height:",height)
    return 2*(width+height)
print(grith(2.5,3.4))
print(grith(height=2.5,width=3.4))
print(grith(3.4,height=2.4))

    在调用该函数时,既可使用传统的根据位置参数来调用,也可根据关键宇参数来调用。在使用关键字调用参数时可交换参数的位置,还可以混合使用位置参数和关键字参数
如果希望在调用函数时混合使用关键字参数和位置参数,则关键字参数必须位于位置参数之后,换言之在关键字参数之后的只能是关键字参数。

5.2.2参数默认值

    在某些情况下,程序需要在定义函数时为一个或多个形参指定默认值——这样在调用函数时就 可以省略为该形参传入参数值,而是直接使用该形参的默认值。 为形参指定默认值的语法格式如下:
形参名=默认值.代码示例

def say_hi(name="齐天大圣",message="欢迎来到西游记"):
    print(name,"您好")
    print("消息是",message)
say_hi()
say_hi("猪八戒")
say_hi("嫦娥","欢迎学习Python")

    通过上述代码可知,,如果只传入一个位置参数,由于该参数位于第一位,系统会将该参数值传给name参数。因此say_hi ( ”欢迎学习 Python”, name=" 白骨精” )调用方式会报错。
    由于 Python要求在调用函数时关键字参数必须位于位置参数的后面,因此在定义函数时指定了默认值的参数(关键字参数)必须在没有默认值的参数之后。

def printTriangle(char,height=5):
    for i in range (1,height+1):

        for j in range(height-1):
            print(" ",end=' ')
        for j in range (2*i-1):
            print(char,end=' ')
        print()
printTriangle('@',6)

    上面程序定义了一个printTriangle()函数,该函数的第一个char参数没有默认值,第二个height参数有默认值。
    Python 要求将带默认值的参数定义在形参列表的最后。
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值