【Python基础】- 自定义函数和匿名函数

简介: 【Python基础】- 自定义函数和匿名函数

Python3 函数


函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。  


函数能提高应用的模块性,和代码的重复利用率。前面我们用过了很多python内置函数,比如print(),input()等。但你也可以自己创建函数,这被叫做用户自定义函数。  


Python函数的分类


Python函数分为如下几类:


1. 内置函数

我们前面使用的 str() 、 list() 、 len() 等这些都是内置函数,可以拿来直接使用


2. 标准库函数

我们可以通过 import 语句导入库,然后使用其中定义的函数


3. 第三方库函数

Python社区也提供了很多高质量的库,下载安装这些库后,也是通过 import 语句导入,然后可以使用这些第三方库的函数


4. 用户自定义函数

用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。


定义一个函数


你可以定义一个由自己想要功能的函数,以下是简单的规则:  


  • - 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • - 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • - 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • - 函数内容以冒号 : 起始,并且缩进。
  • - return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。

"""
Python 定义函数使用 def 关键字,一般格式如下:
def  函数名 ([参数列表]) :
    '''文档字符串'''
    函数体/若干语句
"""
def say_hello():
    print('Hello world!')
say_hello()

# 带参数的函数
def add(a,b,c):
    '''完成三个数的加法,并返回他们的和'''
    sum = a+b+c
    print(f"{a}、{b}、{c}三个数的和是:{sum}")
    return sum
result = add(10,20,30)
print(result)


参数


以下是调用函数时可使用的正式参数类型:  


  • - 位置参数
  • - 关键字参数
  • - 默认参数
'''
位置参数
位置参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
'''
def self_introduction(name,age):  # name和age叫做形参
    print(f'我叫{name},今年{age}岁了!')
self_introduction('艾派森',10)  # '艾派森'和'10'叫做实参

'''
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
'''
def self_introduction(name,age):
    print(f'我叫{name},今年{age}岁了!')
self_introduction(name='艾派森',age=18)
self_introduction(age=20,name='艾派森')

'''
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。
'''
def self_introduction(name,age,school='家里蹲大学'):
    print(f'我叫{name},今年{age}岁了,在{school}上学!')
self_introduction(name='艾派森',age=18)
self_introduction(name='艾派森',age=18,school='哈佛大学')

# 默认参数必须放在最后面,否则会报错
def self_introduction(school='家里蹲大学',name,age,):
    print(f'我叫{name},今年{age}岁了,在{school}上学!')


匿名函数  


Python 使用 lambda 来创建匿名函数。  


所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。  


  • - lambda 只是一个表达式,函数体比 def 简单很多。
  • - lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
  • - lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
'''
lambda 函数的语法只包含一个语句,语法如下:
lambda [arg1 [,arg2,.....argn]]:expression
'''
f = lambda x:x*x
print(f(5))

# 匿名函数传入多个参数,也可以使用关键词传参
f = lambda x1,x2:x1+x2
print(f(10,20)) 
print(f(x1=10,x2=20))


eval()函数


功能:将字符串 str 当成有效的表达式来求值并返回计算结果。  


注:eval函数 会将字符串当做语句来执行,因此会被注入安全隐患。  


比如:字符串中含有删除文件的语句,那就麻烦大了。因此,使用时候,要慎重!!!


变量的作用域(全局变量和局部变量)


变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响。


变量分为:全局变量、局部变量。  


全局变量:


1. 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块结束。

2. 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。

3. 要在函数内改变全局变量的值,使用 global 声明一下


局部变量:


1. 在函数体中(包含形式参数)声明的变量。

2. 局部变量的引用比全局变量快,优先考虑使用

3. 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量

# 【操作】全局变量的作用域测试
n = 50         # 全局变量
def f():
    global n    # 如果要在函数内改变全局变量的值,增加global关键字声明
    print(n)    # 打印全局变量n的值    
    n = 100      
f()
print(n)  # n已经由50经过函数f转变为100

# 【操作】全局变量和局部变量同名测试
a = 50
def f():
    a = 10      # 同名的局部变量
    print(a)
f()    
print(a)    # a仍然是50,没有变化


递归函数


1.递归(recursion)是一种常见的算法思路,在很多算法中都会用到  

2.递归的基本思想就是“自己调用自己”  


递归函数指的是:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。  


每个递归函数必须包含两个部分:  


  • - 终止条件:表示递归什么时候结束。一般用于返回值,不再调用自己。
  • - 递归步骤:把第n步的值和第n-1步相关联。


注:递归函数由于会创建大量的函数对象、过量的消耗内存和运算能力。在处理大量数据时,谨慎使用。

# 计算阶乘:根据用户输入的整数n,计算并输出n的阶乘值。
def fact(n): #计算阶乘
    if n == 0:
        return 1
    else:
        return n * fact(n-1)
num = eval(input("请输入一个正整数: "))
print(fact(num))

'''
斐波那契数列(1、1、2、3、5、8、13、21、34、……)
兔子繁殖问题:
在700多年前,意大利著名数学家斐波那契在《算盘全集》中提到这样一个问题:一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,第n个月有多少对兔子?
F(1)=1
F(2)=1
F(3)=F(1)+F(2)=1+1=2
F(4)=F(2)+F(3)
…………
F(N)=F(N-2)+F(N-1)
'''
def fab(n):
    if n <= 2:
        return 1
    else:
        return fab(n-1)+fab(n-2)
n = eval(input("请输入一个正整数: "))
print(fab(n))
目录
相关文章
|
3月前
|
Python
【Python指南 | 第八篇】自定义函数、输入输出,这一篇就够了
【Python指南 | 第八篇】自定义函数、输入输出,这一篇就够了
62 0
|
4月前
|
Java Go C++
Java每日一练(20230417) N 皇后、搜索二维矩阵、发奖金问题
Java每日一练(20230417) N 皇后、搜索二维矩阵、发奖金问题
25 0
Java每日一练(20230417) N 皇后、搜索二维矩阵、发奖金问题
|
5月前
|
Python
python使用自定义函数和lambda表达式指定排序规则对考试分数降序排列(附源码 可直接使用)
python使用自定义函数和lambda表达式指定排序规则对考试分数降序排列(附源码 可直接使用)
43 0
|
7月前
|
存储 并行计算 数据挖掘
【100天精通Python】Day59:Python 数据分析_Pandas高级功能-多层索引创建访问切片和重塑操作,pandas自定义函数和映射功能
【100天精通Python】Day59:Python 数据分析_Pandas高级功能-多层索引创建访问切片和重塑操作,pandas自定义函数和映射功能
70 2
|
12月前
|
编解码 Python
昨天、今天、明天|Python用datetime库自定义函数返回日期格式字符串
昨天、今天、明天|Python用datetime库自定义函数返回日期格式字符串
159 0
|
Python
python自定义函数 def 的奇妙世界
这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数
71 0
python自定义函数 def 的奇妙世界
|
Python
【Python】自定义函数、lambda函数与内置函数
【Python】自定义函数、lambda函数与内置函数
156 0
【Python】自定义函数、lambda函数与内置函数
|
Python
考点:自定义函数、引用传值、二位列表的输入输出【Python习题02】
考点:自定义函数、引用传值、二位列表的输入输出【Python习题02】
|
Python
Python sort 自定义函数排序
参数 key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。 以下实例演示了通过指定列表中的元素排序来输出列表:指定第二个元进行素排序🤞
114 0
|
计算机视觉 Python
Python入门(六):调用自定义函数
python中内置了很多功能强的函数,能够满足很多时候的开发工作,但有些时候需要自己定义一些函数,来供在其他的地方调用,有些时候需要调用第三方库里面的很多函数,就需要先import第三方库,然后调用里面的方法即可。比如需要引用opencv以及里面的一些函数,可以通过以下方法:
432 0
Python入门(六):调用自定义函数