您现在的位置是:网站首页> 编程资料编程资料

Python函数基础(定义函数、函数参数、匿名函数)_python_

2023-05-26 366人已围观

简介 Python函数基础(定义函数、函数参数、匿名函数)_python_

函数先定义函数,后调用

一、定义函数:

1、简单的规则:

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

2、语法

Python 定义函数使用 def 关键字

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

def 函数名(param1,param2……): """ 函数功能的描述信息 :param1:描述 :param2:描述 :return:返回值 """ code ... return 返回值

3、无参函数

def register(): """注册功能""" username = input('username: ').strip() pwd = input('password: ').strip() with open('32.txt', 'a', encoding='utf8') as fa: fa.write(f"{username}:{pwd}\n") fa.flush()

4、有参函数

def sum_self(x, y): """求和""" res = x+y print(res) sum_self(1,2) # 3

5、空函数

你只知道你需要实现某个功能,但不知道该如何用代码实现时,你可以暂时写个空函数

def func(): pass

二、调用函数及返回值

定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

函数名(param1、param2……)

如:

register()

1、函数运行完毕所有代码,如果函数体不写return,则会返回None。

def foo(): pass print(foo()) #None

2、函数可以返回一个或多个值(元组类型)

def func(): name = 'nick' age = 19 hobby_list = ['read', 'run'] return name, age, hobby_list name, age, hobby_list = func() print(name,age,hobby_list) #('nick', 19, ['read', 'run'])

三、函数的参数

1、普通参数,位置必需参数

在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参。

特点:按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。

def func(x, y): print(x) print(y)

在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参。

特点:按照位置为对应的形参依次传值。

func(1, 2)

2、关键字参数

在调用函数时,按照key=value的形式为指定的参数传值,称为关键字实参。

特点:可以打破位置的限制,但仍能为指定的形参赋值。

func(y=2, x=1)
  • 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
  • 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。
func(x, y=2) func(y=2, x) # SyntaxError: positional argument follows keyword argument func(x, x=1) # NameError: name 'x' is not defined

3、默认参数

在定义阶段,就已经被赋值。意味着在调用时可以不用为其赋值。位置形参必须放在默认形参的左边。

def func(x, y=10): print(x) print(y) func(2)

默认形参的值只在定义阶段赋值一次,也就是说默认参数的值在函数定义阶段就已经固定了。

m = 10 def foo(x=m): print(x) m = 111 foo() # 10

默认参数的值通常应该是不可变类型。

def register(name, hobby, hobby_list=None): hobby_list = [hobby] print(f"{name} prefer {hobby_list}") register('nick', 'read') # ['read'] register('tank', 'zuipao') # [ 'zuipao'] register('jason', 'piao') # ['piao'] # 演示形参是可变类型,(列表是可变类型) def register(name, hobby, hobby_list=None): hobby_list = [hobby] print(f"{name} prefer {hobby_list}") register('nick', 'read') # nick prefer ['read'] register('tank', 'zuipao') # tank prefer ['zuipao'] register('jason', 'piao') # jason prefer ['piao']o']

4、不定长参数之*

形参中的*会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给*后的参数。需要注意的是:*后的参数名约定俗成为args。

def sum_self( *args): res = 0 for num in args: res += num return res res = sum_self(1, 2, 3, 4) print(res) # 10

注意:实参之*

实参中的*,*会将*后参数的值循环取出,打散成位置实参。以后但凡碰到实参中带*的,它就是位置实参,应该马上打散成位置实参去看。

def func(x, y, z, *args): print(x, y, z, args) func(1, *(1, 2) , 3, 4) # 1 1 2 (3, 4)

5、不定长参数之**

形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的参数。需要注意的是:**后的参数名约定俗成为kwargs。

def func( **kwargw): print(kwargw) func(a=5,b=3) # {'a': 5, 'b': 3}

注意:实参之**

实参中的**,**会将**后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带**的,它就是关键字实参,应该马上打散成关键字实参去看。

def func(x, y, z, **kwargs): print(x, y, z, kwargs) func(1, 3, 4, **{'a': 1, 'b': 2} ) # 1 3 4 {'a': 1, 'b': 2}

可变长参数应用

def index(name, age, sex): print(f"name: {name}, age: {age}, sex: {sex}") # name: nick, age: 19, sex: male def wrapper(*args, **kwargs): print(f"args: {args}") # args: () print(f"kwargs: {kwargs}") # kwargs: {'name': 'nick', 'sex': 'male', 'age': 19} index( *args, **kwargs) wrapper(name='nick', sex='male', age=19)

6、命名关键字参数

命名关键字则是在「位置参数」和「命名关键字参数」中使用,*,隔开,后面的即为命名关键字。* 后的参数必须用关键字传入。

def student(name, age, *, city, gender): print(name, age, city, gender) student('xiaoming', 6, city='beijing', gender='male') # xiaoming 6 beijing male student('xiaoming', 6, 'beijing', 'male') #TypeError: student() takes 2 positional arguments but 4 were given

特点:在传值时,必须按照key=value的方式传值,并且key必须命名关键字参数的指定的参数名。

def register(x, y, *, name, gender='male', age): print(x) print(name) print(age) register(1, 2, name1='nick', age=19) # T
                
                

-六神源码网