python入门训练营——函数和Lambda表达式

函数

1. 函数就是有特定功能的工具 。Python中有内置函数(Python解释器预先封装好的)与 自定义函数(用户自定义封装的)之分。

2. 使用函数的原因:可以减少代码冗余,增加代码复用性;使代码逻辑更加清晰;一次编写,任意次数调用。

3. 一个标准的函数定义格式是:

def 函数名(形参1, ......):
    '''
    该函数的作用(函数的注释)
    :param 形参1: 对形参1的解释
    :param .....: .....
    :return: 
    '''
    代码体
    return 函数的返回值

'''
注意:
函数名的命名规则与变量名的一模一样 
不能以关键字作为函数名,避免与内置函数重名
函数也应该做到见名知意 
'''

'''
函数在定义阶段只检测语法,不执行代码
比如里面写多了一个 if  后面就没了,运行就会报错
执行的时候,代码有问题才会报错了

变量可以通过变量名找到对应的值
函数可以通过 函数名 加 括号 找到函数体所对应的的代码并执行

函数必须先定义后调用(函数名+括号)
定义了之后的函数可以在任意位置调用
'''

4. 返回值

利用 return 关键字可直接结束函数。

所有的函数都有返回值,无论写不写return。python中,不写返回值默认返回 None。只写 return 或者 return None 并不是为了考虑返回值的问题,而是为了结束函数的运行。

   函数返回值的五种情况:

# 1.不写return
def func_no_return():
    print(1, 2, 3)
print(func_no_return())  # 接收到的是None
# 1 2 3
# None

# 2.return后面什么也不跟
def func_just_return():
    print(1, 2, 3)
    return
    print("hello world.")  # 这一句print 并未被执行
print(func_just_return())  # 接收到的是None
# 1 2 3
# None

# 3.写return None
def func_return_none():
    print(1, 2, 3)
    return None
print(func_return_none())  # 接收到的是None
# 1 2 3
# None

# 4.写return 返回一个值
def func_return_one():
    print(1, 2, 3)
    return 1
print(func_return_one())  # 接收到的是返回值 1, 这个值可以是python的任意数据类型
# 1 2 3
# 1

# 5.写return多个值
def func_return_many():
    print(1, 2, 3)
    return 1, 2, 3
print(func_return_many())  # 接收到的是一个元组,包裹上这三个元素,想要多个返回值不被包装成元组返回,可以选择将其整体包装成一个大类型(例如列表,最外层在套一个列表 [[1,2,3]. [1,2,3]])
# 1 2 3
# (1, 2, 3)

 

5. 函数的参数

形参:在函数定义阶段,函数的括号内写的变量名,叫做该函数的形式参数,简称形参 

实参:在函数调用阶段,括号内实际传入的值,叫做实际参数,简称实参 

形参与实参的关系:形参就相当于变量名,而实参相当于变量的值,函数调用传参的过程就是给形参、变量名赋值的过程 

默认值参数:在函数的定义阶段,形参(变量名)就已经被赋值了的参数。如 def my_max(x,y=100): 这里的y就是一个默认值参数

注意:

1. 实参和形参的绑定关系只在函数的运行阶段有效,函数运行结束后自动解除 。也只在函数内部有效。

2. 在函数的调用阶段 位置参数和关键字参数 可以混合使用。但是必须保证:位置参数必须在关键字参数的前面(越短的越靠前,越长的越复杂的越靠后);同一个形参不能被多次赋值。

# 位置形参:在函数定义阶段按照位置从左往右依次书写的变量名
def my_max(x, y):
    print(x, y)
    if x > y:
        return x
    else:
        return y
# res = my_max(1)  # 会报错,在调用函数的时候 少一个实参不行
# res = my_max(1, 2, 3)  # 会报错,在调用函数的时候 多一个实参也不行


# 第一种直接按照位置传  一一对应
res = my_max(20, 10)
# 20 10
# 位置实参:在函数的调用阶段 传入的参数会按照位置一一对应给形参

# 第二种指名道姓的传  >>>:关键字传参
my_max(y=20, x=10)
my_max(10, y=20)  # 位置和关键字混合使用
my_max(20, y=40)
# 10 20
# 10 20
# 20 40

参数组合:

在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:
位置参数、默认参数、可变参数和关键字参数。
位置参数、默认参数、命名关键字参数和关键字参数。

要注意定义可变参数和关键字参数的语法:
*args 是可变参数,args  接收的是一个 `tuple`
**kw 是关键字参数,kw  接收的是一个 `dict`

 

6. 函数的注释

"""
该函数的作用
:param x: 对形参x的解释
:param y: 对形参y的解释
:return: 对函数返回值的解释
"""

参考:https://www.cnblogs.com/suwanbin/p/11152151.html
 

练习题:


1. 怎么给函数编写文档?

函数文档就是用来查看当前函数相关信息介绍的一个特定格式。查看函数文档的方法:

help(函数名)
    此方法会直接输出函数文档的内容


函数名.__doc__
    直接输出显示函数文档的内容元字符串
    (可以使用 print(函数名.__doc__) 来解决无格式问题)

例如:

    #定义函数文档的方式
    def funName(**sample):
        '''
        这里是函数文档
        本函数功能是...
        要求的参数类型是...
        返回的数据是...
        '''
 
        print('函数文档的定义方法')
 
    help(funName)  #查看函数文档
 
    '''
    函数文档的作用是对函数进行说明,便于阅读和快速掌握函数的使用,通常函数文档需要具有以下信息:
    1.函数的作用
    2.函数的参数介绍(需要几个参数,分别是什么类型)
    3.函数的返回值(数据和类型)
    '''


2. 怎么给函数参数和返回值注解?

参数注解就是在定义函数时,在参数列表内部的参数后面加上冒号和要传入的类型,写了参数注解也无法强制限定变量的类型,只能作为提示,来告知使用者应该传入什么类型的参数。如:

def accumlate(x:int, y:int):
    return x*y

返回值注解就是在参数列表后面,冒号前面,增加一个 -> 后面接返回值的类型。如:

def accumlate(x:int, y:int) -> int:
    return x*y

这些注解都会以字典的形式存在函数的.__annotations__属性中。

accumlate.__annotations__
{'x': int, 'y': int, 'return': int}

print(accumlate.__annotations__)
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}


3. 闭包中,怎么对数字、字符串、元组等不可变元素更新。

**闭包**

- 是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。
   - 如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。
- 通过闭包可以访问外层非全局作用域的变量,这个作用域称为 <b>闭包作用域</b>。

闭包的返回值通常是函数。
如果要修改闭包作用域中的变量则需要 `nonlocal` 关键字

 


4. 分别根据每一行的首元素和尾元素大小对二维列表 a = [[6, 5], [3, 7], [2, 8]] 排序。(利用lambda表达式)

a=[[6, 5], [3, 7], [2, 8]] 
print(a)
x = sorted(a, key=lambda a: a[0], reverse=False)
print("按照首字符正序排列:"+str(x))
x = sorted(a, key=lambda a: a[0], reverse=True)
print("按照首字符逆序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=False)
print("按照尾字符正序排列:"+str(x))
x = sorted(a, key=lambda a: a[1], reverse=True)
print("按照尾字符逆序排列:"+str(x))


5. 利用python解决汉诺塔问题? 有a、b、c三根柱子,在a柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在c柱子上,尝试用函数来模拟解决的过程。(提示:将问题简化为已经成功地将a柱上面的63个盘子移到了b柱)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值