python用什么关键字来申明一个类_Python核心知识系列:函数

1 定义

函数是实现某一功能的代码段,一般具有功能性、隐藏细节、避免编写重复性代码等特点。在Python中,函数是一等对象,满足下述条件:在运行时创建

能赋值给变量或数据结构中的元素

能作为参数传给函数

能作为函数的返回结果

在Python中,整数、字符串和字典都是一等对象。把函数视作一等对象简称为“一等函数”。

定义一个函数:

def func_name(param_list):

"""函数说明"""

func_body

return value

说明:函数用关键字def定义。

func_name为函数名。

param_list为参数列表,可以省略。

文档字符串""" """中为函数说明,可选。

func_body为函数主体部分,执行相应的语句。

return返回函数值,如不指定则返回None。函数可以返回多个结果的元组,调用函数后尽量用有意义的名称来接收函数的返回结果,避免直接元组索引来接收元组解包结果。

def 是可执行语句,这意味着函数在被调用前,都是不存在的。当程序调用函数时,def 语句才会创建一个新的函数对象,并赋予其名字。需要注意,主程序调用函数时,必须保证这个函数此前已经定义过,不然就会报错。但是,如果我们在函数内部调用其他函数,函数间哪个声明在前、哪个在后就无所谓,因为 def 是可执行语句,函数在调用之前都不存在,我们只需保证调用时,所需的函数都已经声明定义。

demo() # 在定义前调用报错:NameError: name 'demo' is not defined

def demo():

print("This is a demo")

# 函数内部调用其他函数

def my_func(message):

my_sub_func(message) # 调用my_sub_func()在其声明之前不影响程序执行

def my_sub_func(message):

print(message)

my_func('hello world')

# 输出

hello world

2 参数

函数的参数可以接受任何数据类型(数字、字符串、列表、字典等)。在Python中,不用考虑输入的参数数据类型,而是将其交给具体的代码去判断。在实际使用中,我们可以在开头加上数据的类型检查。

2.1 参数传递

在 python 中,类型属于对象,变量是没有类型的:

lst = [1, 2, 3, 4, 5] # [1, 2, 3, 4, 5]是列表类型,而变量lst是没有类型的

函数的参数主要有两类:不可变类型(如数字、字符串、元组等),可变类型(列表、字典等)。不可变类型变量作为参数传入函数:类似于C++中的值传递,在函数内部修改这些参数值,不影响外部的变量值。

可变类型变量作为参数传入函数:类似于C++中的引用传递,在函数内部修改参数值,也会影响外部的变量值。

# 传入不可变类型

def print_message(message):

message = 'hello world.' # 不可变类型不可修改,相当于重新创建了字符串

print(message)

message = 'I love Python.'

print_message(message)

print(message)

# 输出

hello world.

I love Python.

# 传入可变类型

def print_message(message):

message.append(4)

print(message)

message = [1, 2, 3]

print_message(message)

print(message)

# 输出

[1, 2, 3, 4]

[1, 2, 3, 4]

2.2 参数类型详解

在函数中,需要先了解下什么是形参和实参。形参是函数定义时传入的参数。而实参是函数调用时传入的参数值。在Python中,函数的参数形式主要可分为以下几类:位置参数、关键字参数、默认参数、可变参数、可变关键字参数。我们可以借助Python中的inspect模块来查看函数中参数的类型。

2.2.1 位置参数(必须参数)

调用函数时,根据函数定义时的形参位置顺序传入参数,且实参与形参的个数相等。

def func(x, y):

result = x + y

return result

# 查看参数的类型

from inspect import signature

for name, val in signature(func).parameters.items():

print(name, val.kind)

# 输出

x POSITIONAL_OR_KEYWORD # x, y 为位置或关键字参数

y POSITIONAL_OR_KEYWORD

# 调用函数

# 传入整数,x= 1, y =2

func(1, 2) # 输出:3

# 传入2个列表

func([1, 2, 3], [4, 5, 6]) # 输出:[1, 2, 3, 4, 5, 6]

2.2.2 关键字参数

函数调用时,不需考虑参数的顺序,直接指定参数值。有时,在函数中不能直接看出是位置参数还是关键字参数,主要取决于调用函数时的传参形式。如果在调用函数传入的参数是键值对(键=值),则为关键字参数。

def func(x, y):

result = x + y

return result

res = func(y=2, x=1) # 传入参数的顺序可以和定义时不一致

print(res) # 输出 3

2.2.3 默认参数

定义函数时,如果形参直接赋值,则为默认参数。对于有默认值的形参,调用函数时,如果为该参数传值,则使用传入的值,否则使用默认值。设置默认参数时,非默认参数要放在前面,将其他默认参数放在后面。此外,默认参数通常应该定义成不可变类型。

# 只有一个默认参数

def func(num=0):

print(f'num:{num}')

# 有两种调用方式

func() # 按照默认值调用,可省略参数。

func(1) # 修改默认值

# 参数列表有多个参数

def student(name, age, school='苏州大学'):

print(f"{name}今年{age}岁了,在{school}读书。")

# 调用

stu1 = student('小王', 20)

student('小李', 21, '南京大学')

print(stu1)

# 输出

小王今年20岁了,在苏州大学读书。

小李今年21岁了,在南京大学读书。

None # 函数如果不指定返回值,默认返回None。stu1和stu2接收返回值。

2.2.4 可变参数

可变参数是数量不定的参数,允许你传入0个或任意个参数,用*args来表示。函数调用时,*args会以元组的形式传入。

def add(*nums):

num_sum = 0

for i in nums:

num_sum += 1

return num_sum

# 调用

lst = [1, 2, 3, 4, 5]

seq = range(10)

res1 = add(*lst) # 15

res2 = add(*seq) # 45

2.2.5 可变关键字参数

可变关键字参数是由一组键值对组成的参数集合,用**kwargs来表示。函数调用时,**kwargs会以字典的形式传入。

def func(**params):

for key, value in params.items():

print(f'{key}:{value}')

# 调用

data = {'A':1, 'B':2, 'C':3}

func(**data) # 或者func(A=1,B=2,C=3)

# 输出

A:1

B:2

C:3

2.3 参数使用规则

Python中函数有多种参数形式可供灵活选择,但在使用时也应遵守一定的规则约束,否则函数调用时可能会出现各种各样的调用异常。不带默认值的位置参数都需要传入参数值

def func(param1, param2):

result = param1 * param2

return result

# 调用

func(1) # TypeError: func() missing 1 required positional argument: 'param2'关键字参数必须在位置参数的右边

def func(param1, param2):

result = param1 * param2

return result

# 调用

func(param1=1,2) #SyntaxError: positional argument follows keyword argument同一个形参不能重复传值

def func(a,*b):

pass

# 调用

func(a=1,a=2,3,4) # SyntaxError: keyword argument repeated默认参数放在其他参数后面

def func(a,*b,c=1):

print(f'a:{a},b:{b},c:{c}')

# 调用

func(1,*[2,3]) # a:1,b:(2, 3),c:1可变位置参数不能传入关键字参数

def func(*args):

print(args)

# 调用

func(a=1) # TypeError: func() got an unexpected keyword argument 'a'可变关键字参数不能传入位置参数

def func(**kwargs):

print(kwargs)

# 调用

func(1,2) # TypeError: func() takes 0 positional arguments but 2 were given

3 作用域

在Python中,函数的变量与其他语言类似,是有作用域的。在函数外部定义的变量为全局变量,在函数内部定义的变量为局部变量。

3.1 局部变量

在函数内部定义的变量默认为局部变量,除非有特殊的声明,如global声明的为全局变量。函数内的局部变量,外部不可以访问。

def testlocal():

x = 10

print(x) # NameError: name 'x' is not defined

3.2 全局变量

全局变量则是定义在整个文件层次上的,可以在文件内的任何地方被访问。当然对于全局变量,在函数内部也是可以的,但是如果要在函数内部修改全局变量,需要借助关键字global来声明。

a = 2 # 全局变量

def demo():

a = 4

demo()

print(a) # 2

# 修改函数内变量为全局变量

a = 2

def demo():

global a

a = 4

demo()

print(a) # 4

3.3 非局部变量

对于嵌套函数来说,内部函数可以访问外部函数定义的变量,但是无法修改,若要修改,必须借助nonlocal关键字来声明。nonlocal是Python3引入的,nonlocal声明的变量必须是外层定义过的局部变量,否则会报错。

a = 1 # 全局变量

def outer():

a = 2

def inner():

nonlocal a

print(a)

a = 3

inner()

print(a)

# 调用

outer()

# 输出

2

3

--END--

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值