Python函数详解:从内建函数到自定义函数的定义、调用与参数传递技巧

[id_[id_[id_[id_68[id_470669404]646043]444133515]35112406]20550229]

Python函数详解:从内建函数到自定义函数的定义、调用与参数传递技巧

一、函数的定义与调用

# 定义函数时,指定形参[id_1085086342]a , b) :    m=a*b    print(m)# 调用函数时,传递实参fn(2,8)

二、参数传递

在 python 中,类型是属于对象的。对象存在着不同类型的区分。而变量是没有类型的。参数可以分为必需参数、关键字参数、默认参数以及不定长参数。

1、必需参数

需按照正确的顺序将参数传入函数。在进行调用时,参数的数量必须与声明时的数量相同。例如:

def p1( str ):    #"打印任何传入的字符串"    print (str)    returnp1("打印")p1()# 调用 p1 函数,不加参数会报错

2、关键字参数

关键字参数与函数调用的关系较为紧密,在函数调用过程中,通过使用关键字参数可以明确传入的参数值。使用关键字参数的好处在于,它允许函数调用时参数的顺序与声明时不同,这是因为 Python 解释器能够依据参数名来匹配参数值。例如:

def p2([id_1012051577]):    print ("名字: ", name)    print ("年龄: ", age)    print ("性别: ", gender)    returnp2( gender="男",age=20, name="张三" ) #此时参数不需要指定顺序

3、默认参数

调用函数时,如果没有传递参数,则会使用默认参数。

def fn(a = 5 , b = 10 , c = 20):    print('a =',a)    print('b =',b)    print('c =',c)fn(1,2,3)fn()

4、不定长参数

有时需要一个函数能够处理比当初声明时更多的参数。这些参数被称作不定长参数,它与上述的 2 种参数不一样,在声明时不会被命名。添加了星号 * 的参数会以元组的形式被导入,并且会存放所有未被命名的变量参数。

def p1( a, *b):   print (a)   print (b)   # 调用p1函数p1(1,2,3,4,5,6,7,8,9,10)  #输出结果  1   (2, 3, 4, 5, 6, 7, 8, 9, 10)
如果在函数调用时未指定参数,那么它就是一个空元组。我们还可以不向函数传递未命名的变量。p1(1)   #输出结果  1   ()
#加了两个星号 ** 的参数会以字典的形式导入。def p2( a, **b):    print (a)    print (b)p2(1,m=2,n=3)
声明函数时,参数中星号 * 能够单独出现。不过,星号 * 之后的参数必须通过关键字来传入。def p2( a,*b,c):    print (a)    print (b)    print (c)p2(0,1,2,3,4,5,c=6)p2(0,1,2,3,4,5,6)   #报错

5、匿名函数

Python 通过 lambda 来构建匿名函数。这意味着不再采用 def 语句这种标准的方式去定义一个函数。

定义一个名为 sum 的函数,该函数接受两个参数 arg1 和 arg2,函数的功能是将这两个参数相加并返回结果。# 调用sum函数print ("相加后的值为 : ", sum( 10, 20 ))print ("相加后的值为 : ", sum( 20, 20 ))我们能够把匿名函数封装在一个函数里面,如此一来就可以运用相同的代码去创建多个匿名函数。def myfunc(n):    return lambda a : a * nmydoubler = myfunc(2)mytripler = myfunc(3)print(mydoubler(11))print(mytripler(11))

三、return语句

return [表达式]语句的作用是退出函数,并且可以选择性地向调用方返回一个表达式。如果使用不带参数值的 return 语句,那么就会返回 None。

def sum( arg1, arg2 ):    # 返回2个参数的和.    total = arg1 + arg2    print ("函数内 : ", total)    return total# 调用sum函数total = sum( 10, 20 )print ("函数外 : ", total)

四、函数作用域与命名空间

1、作用域(scope)

指的是变量生效的区域

b = 20 # 全局变量def fn():    a = 10a 被定义在了函数内部,这就导致它的作用域局限在函数内部,而在函数外部是无法对其进行访问的。    print('函数内部:','a =',a)    print('函数内部:','b =',b)

在Python中一共有两种作用域:

程序执行时会创建全局作用域,程序执行结束时全局作用域会被销毁。除所有函数之外的区域都属于全局作用域。在全局作用域里定义的变量是全局变量,这些全局变量能够在程序的任何位置被访问。

函数作用域是在函数调用时创建的,并且在调用结束时会被销毁。每当函数被调用一次,就会产生一个新的函数作用域。在函数作用域中所定义的变量,都属于局部变量,这些局部变量只能在函数的内部被访问到。

使用变量时,会先在当前作用域查找该变量。若找到则使用,若未找到则去上一级作用域查找。若在上一级作用域找到则使用,若仍未找到则继续去上一级作用域查找,如此类推,直至找到全局作用域。若在全局作用域仍未找到,则会抛出异常:NameError: name 'a' is not defined

2、命名空间

变量存储的位置即为其指代的内容,每一个变量都必须存储到特定的命名空间里,并且每一个作用域都拥有一个与之对应的命名空间。全局命名空间的作用是保存全局变量,而函数命名空间则用于保存函数中的变量。实际上,命名空间就如同一个字典,是专门用来存储变量的工具。

locals()的作用是获取当前所处的作用域的命名空间。若在全局作用域中调用 locals(),就会获取到全局命名空间;倘若在函数作用域中调用 locals(),则会获取到函数命名空间。

五、递归

递归函数一般包含两个关键部分,一是基准情况,用于终止递归;二是递归步骤,用于把问题分解为更小的子问题。

#案例:计算阶乘def factorial(n):    if n == 0:        return 1  # 基准情况    else:        return n * factorial(n - 1)  # 递归步骤# 测试print(factorial(5))  # 输出: 120
#当然也可以使用迭代计算def factorial_iterative(n):    result = 1    for i in range(1, n + 1):        result *= i    return result# 测试print(factorial_iterative(5))  # 输出: 120

递归方法是通过函数调用自身的方式来逐步缩小问题的规模,直至达到基准情况;迭代方法则是借助循环结构来逐步累积结果。两种方法都能够得出正确的结果,不过在内存使用以及性能方面或许会存在差异。对于像阶乘这类规模较小的问题,递归与迭代的性能差异或许不太显著,但在应对更大规模的问题时,迭代通常会更加高效。

六、闭包

在 Python 中,闭包指的是在一个函数内部定义另一个函数。这个内层函数会引用外层函数的变量。当外层函数执行完毕后,其作用域中的变量会被内层函数所“捕获”。之后,这些被捕获的变量能够被继续访问。而这个被捕获的环境与内层函数共同构成了闭包。

def m_01():    count = 0  # 外层函数的变量    def n_01():声明用于访问外层函数的变量 count 。        count += 1        return count返回内层函数,从而形成闭包。
# 创建闭包实例n_01 = m_01()print(n_01())  # 输出: 1print(n_01())  # 输出: 2print(n_01())  # 输出: 3

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读