Beng Dou

一只站在树上的鸟儿,从来不会害怕树枝断裂,因为它相信的不是树枝,而是它自己的翅膀。

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

[ Python入门教程 ] Python函数定义和使用

  函数是一段可以重复多次调用的代码,通过输入的参数值,返回需要的结果。通过使用函数,可以提高代码的重复利用率。本文主要介绍Python函数的定义、调用和函数参数设置方法。

函数的定义

  Python函数定义非常简单,使用关键字def定义。函数必须先定义后使用。Python函数定义的格式如下所示:

def 函数名(参数1,参数2,...):
    语句块
    return [表达式]

  函数名可以是字母、数字或下划线组成的字符串,但是不能以数字开头。函数的参数放在一对圆括号中。参数的个数可以有一个或多个,参数之间用逗号隔开。括号后面以冒号结束,冒号下面就是函数的主体。函数的返回使用return语句,return [表达式]结束函数。如果return后面不带表达式,表示返回None。实例如下:

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

函数调用

  函数调用采用函数名加一对圆括号的方式,圆括号内的参数是传递给函数的具体指。函数调用格式如下:

 函数名(实参1,实参2...)

  实际参数必须与形式参数一一对应,否则将报错。具有默认值的参数例外。上述power()函数的调用方法如下:

power(3,2)

函数的参数

  函数定义的时参数名和位置就已经确定。使用函数时只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。

(1)位置参数

  位置参数指的是调用函数时根据函数定义的参数位置来传递参数。上述power()函数的x,n参数就表示参数。调用时可以直接通过传参嗲用。函数调用时传入参数个数必须与位置参数个数一致,否则会报错。实例如下:

复制代码
# -*- coding:utf-8 -*- 

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

print "power(3, 2) = ", power(3, 2) #传入参数个数与定义的位置参数一致。
print "power(3) = ", power(3) #传入参数个数与定义的位置参数不一致。报错"TypeError: power() takes exactly 2 arguments (1 given)"
复制代码

(2)默认参数

  函数的参数支持默认值。当某个参数没有传递实际的值时,函数将使用默认参数计算。特别注意的是,在函数定义和调用时,所有位置参数必须出现在默认参数前。修改power函数代码如下:

复制代码
def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

print "power(3) = ", power(3) #不带参数n调用函数,n赋默认值为2
print "power(3, 2) = ", power(3, 2) #参数n指定值为2调用函数
print "power(3, 3) = ", power(3, 3) #参数n指定值为3调用函数
复制代码

 代码运行结果如下:

power(3) =  9
power(3, 2) =  9
power(3, 3) =  27

(3)可变参数

  可变参数就是值允许调用函数时传入参数个数是可变的,可以是1个,2个或者多个,这些可变参数在函数调用时自动组装为一个tuple。因此在函数内部获取可变参数时,参数接收到的是一个元组。可变参数在函数定义时的格式如下:

def 函数名(*args):
    ....
    return 变量或表达式

  可变参数在函数定义时对形参前加一个星号*,如*args。实例如下:

复制代码
def fun1(x,y,*args):
    print "x = ", x
    print "y = ", y
    print "type(*args) = ", type(args) #可变参数args在函数内部获取到的类型
    print "args = ", args #可变参数args获取的传入的值
    
    sum = 0
    for i in args:
        sum += i
    print "sum = ", sum

fun1('A', 'B', 1, 2, 3, 4)
复制代码

 代码运行输出结果如下:

x =  A
y =  B
type(*args) =  <type 'tuple'>
args =  (1, 2, 3, 4)
sum =  10

  通过上述实例,我们知道。可变参数args可以传入任意数量参数。函数内部获取可变参数的类型为tuple。

(4)关键参数

  关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。这是不同于可变参数的地方。函数定义时使用关键参数的格式如下:

def 函数名(**kw):
    ....
    return 变量或表达式

  关键参数在函数定义时对形参前加两个星号**,如**kw。实例如下:

复制代码
def fun1(x,y,**kw):
    print "x = ", x
    print "y = ", y
    print "type(**kw) = ", type(kw)
    print "kw = ", kw
    
    for key, value in kw.items():
        print key, value

fun1('A', 'B', num1=1, num2=2, num3=3, num4=4)
复制代码

 代码运行结果如下:

复制代码
x =  A
y =  B
type(**kw) =  <type 'dict'>
kw =  {'num4': 4, 'num1': 1, 'num2': 2, 'num3': 3}
num4 4
num1 1
num2 2
num3 3
复制代码

  从上述结果可以知道,函数内部获取的关键参数的类型为字典(dict),使用时以字典形式操作即可。

函数的嵌套

 函数的嵌套是指在函数的内部调用其他函数。C、C++只允许在函数体内部嵌套。而Python不仅支持函数体内嵌套,还支持函数定义的嵌套。通过2个实例分别查看,如下

(1)函数体内嵌套

复制代码
def sum(a, b):
    return a + b

def sub(a, b):
    return a - b

def fun1():
    x=1
    y=2
    m = 2
    n = 4
    return sum(x, y) * sub(m, n)

print fun1()
复制代码

(2)函数定义的嵌套。不推荐使用,代码可读性、可维护都不好。

复制代码
def fun1():
    x=1
    y=2
    m = 2
    n = 4
    def sum(a, b):
        return a + b

    def sub(a, b):
        return a - b
    return sum(x, y) * sub(m, n)

print fun1()
复制代码

匿名函数lambda

  lambda函数用于创建一个匿名函数,函数名未和标识符进行绑定。使用lambda函数可以返回一些简单的运算结果。lambda函数的格式如下所示:

lambda 变量1,变量2,...: 表达式

  其中,变量列表用于表达式的计算。lambda属于函数,因此变量列表后需要一个冒号。通常把lambda赋值给一个变量,变量就可以作为函数使用。另外,lambda中只能使用表达式,不能使用判断、循环等多重语句。常用实例如下:

>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))

 

posted on   锅边糊  阅读(707)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示