首页 > 其他分享 >11. 函数的参数

11. 函数的参数

时间:2024-07-25 18:39:52浏览次数:13  
标签:11 f1 函数 参数 print def name

1. 函数的概念与定义

1.1 概念

循环的本质:在相同的地方反复执行相同的代码

函数的本质:在不同的地方反复执行相同的代码

1.2 语法

def 函数名(参数1,参数2):
    """函数的注释"""
    函数体代码
    return 返回值
1. def:是定义函数的关键字
2. 函数名:函数名类似于变量名,指代函数体代码,
         命名与变量名一致(字母、数字、下划线、数字不能开头;下划线形式、驼峰体形式)
         类似于数学函数中的 h(x)的h,  f(x)的f
3. 括号:定义函数的时候,函数名后面一定要有括号
4. 参数:类似于使用函数的时候,给函数内部传递的数据,可以不写,或者单个、多个
        有点像数学函数中f(x)的x
5. 冒号:定义函数也需要有缩进的代码块
6. 函数的注释:用于解释函数的主要功能、使用说法等说明性文字
7. 函数体代码:函数的核心功能
            有点像数学函数中f(a)右侧的函数式  f(a,b) = a + b
8. return:后面跟什么,函数执行完成后就会返回什么

定义函数不会执行函数体代码,但是会检测语法

# 1.函数的基本定义
def f1():
    a = 1 +1
f1()  
print(f1())  # None

# 2.有一个参数但是没有返回值的函数
def f2(name):
    b = 1 + 2
f2('messi')  #
print(f2('messi'))  # None

# 3.有多个参数但是没有返回值
def f3(x, y):
    res = x + y
# 函数调用的时候,定义几个参数就必须传几个参数
f3(333, 666)
print(f3(333, 666))  # None

# 4.有参数有返回值的函数
def f4(a, b):
    res2 = a * b
    return res2
print(f4(9, 9))  # 81

1.3 函数的调用

(1)直接调用

根据函数名调用函数

(2)间接调用

用新的变量名来存储原本函数的内存空间地址,然后再调用原本的函数

def f(x, y):
    return x * y
print(f)  # <function f at 0x0000024F50773E20>
# 可以将函数名赋值给其它变量名
h = f
print(h(16, 16))  # 256

(3)表达式调用

在函数的返回值中如果只有一个返回值就是该值本身的类型

如果有多个返回值,返回的结果是一个元组---解压赋值

def f1(x, y):
    return x + y
print(f1(11, 22),type(f1(11, 22)))  # 33 <class 'int'>

def f2(a, b):
    res1 = a + b
    res2 = a * b
    return res1, res2
print(f2(3, 3),type(f2(3, 3)))  # (6, 9) <class 'tuple'>

1.4 函数的返回值

函数体代码里面写return相当于循环体代码里面写break,遇到了就会立刻结束函数和循环的执行

如果写的是变量名就返回变量名指向的值

函数的返回值可以被其它变量接收

函数的返回值可以被其它函数接收

def f1(a, b):
    return a + b
def f2(x, y):
    return x * y
print(f2(f1(1,2), 10))  # 30

1.5 函数作为参数

def get_name_pwd():
    name = input("请输入名字: ")
    pwd = input('请输入密码')
    return name, pwd


def login():
    login_name, login_pwd = get_name_pwd()
    if login_name == 'messi' and login_pwd == '001':
        print('登录成功')
    else:
        print('登录失败')


def regi():
    regi_name, regi_pwd = get_name_pwd()
    print(f'用户{regi_name}注册成功')
-------------------------------------------------------------------

choice = """
***功能菜单***
1.注册
2.登录
"""
func_dict = {
    '1': regi,  # 函数名regi即函数regi的内存地址
    '2': login  # 函数名login即函数login的内存地址
}
while True:
    print(choice)
    id = input('请输入功能id:')
    if id not in func_dict:
        print('你的输入有误')
        continue
    f1 = func_dict.get(id)
    # f1可以是regi的内存地址,也可能是login的地址
    f1()
之前的写法
while True: print(choice) id = input("请输入功能ID :>>>> ").strip() if id == '1': regi() elif id == 2: login()

2. 函数的参数

2.1 形参与实参

形参:函数在定义阶段括号内写的参数,称之为形式参数

实参:函数在调用阶段括号内写的参数,称之为实际参数

形参类似于变量名,实参类似于变量值

在调用函数的时候传入实参,会与形参临时绑定,函数运行结束之后自动解除绑定

def f1(x, y):  # x和y就是f1函数的形参
    print(x + y)

f1(11, 22)  # 11和22就是f1函数的实参

2.2 位置参数和关键字参数

位置参数

位置形参:在函数定义阶段括号内从左往右依次填写的变量名

位置实参:在函数调用阶段括号内从左往右依次传入的数据

在调用的时候参数个数要相等,顺序不能乱

关键字参数

出现在实参中,用变量的方式给函数传参,与顺序无关

def f1(x, y):
    print(x + y)
f1(x=11, y=22)  # 33
f1(y=2, x=3)  # 5
位置参数与关键字参数混用
def f1(x, y): print(x + y) f1(y=111, 222) # 报错,关键字参数必须放在位置参数的后面 f1(333, x=444) # 报错,形参只能指向一个实参,形参x重复绑定值

2.3 默认参数

在函数的定义阶段给变量名赋一个初始的值

如果该变量被传入新的值,则初始值会被新值覆盖

如果该变量没有被传入新的值,则还是使用初始的默认值

默认参数必须放在位置参数后面

def player(name, num, club='psg'):
    print(f'球员{name}号码{num}球队{club}')
player('messi', 1)
player('kylian', 2)
player('ronaldo', 3,'realmadrid')
# 球员messi号码1球队psg
# 球员kylian号码2球队psg
# 球员ronaldo号码3球队realmadrid

默认参数的特殊情况

a = []
def app_element(num):
    a.append(num)
    return a
print(app_element(1))  # [1]
print(app_element(2))  # [1, 2]
print(app_element(3))  # [1, 2, 3]
----------------------------------------------------------
def app_element(num, a=[]):
    a.append(num)
    return a
# 因为列表是可变数据类型所以 在每次添加新的元素后影响到的都是原本的列表
# 列表中添加 1 2 3 ---> [1,2,3]
print(app_element(1))  # [1]
print(app_element(2))  # [1, 2]
print(app_element(3))  # [1, 2, 3]
def app_element(num, a=None):
    if not a:
        a = []
    a.append(num)
    return a

print(app_element(1))  # [1]
print(app_element(2))  # [2]
print(app_element(3))  # [3]

2.4 可变长参数

需求:定义一个函数,无论穿多少位置实参都可以正常执行

可变长位置参数

*号在形参中,可以接收多余的位置参数,组成元组的形式赋值给*号后后面的变量名

推荐写法  *args

def f1(a, b, *args):
    print(a, b)  
    print(args)  
f1(1, 2, 3, 4)
# 1 2
# (3, 4)

*号是压缩与解压的意思

a = [1, 2, 3]
print(a)  # [1, 2, 3]
print(*a)  # 1 2 3
def f1(name, num):
    print(f'球员{name}')
    print(f'号码{num}')
info = ['messi', '001']
f1(*info)
# 球员messi
# 号码001

**号在形参中,用于接收多余的关键字参数,组成字典的形式赋值给**后面的变量名

推荐写法   **kwargs

def add(x, y, *args, **kwargs):
    print(x, y)
    print(args)
    print(kwargs)
add(1, 2, 3, 4, 5, a=666, b=999)
# 1 2
# (3, 4, 5)
# {'a': 666, 'b': 999}

                                                              

 

标签:11,f1,函数,参数,print,def,name
From: https://www.cnblogs.com/hbutmeng/p/18323235

相关文章

  • STM32 HAL 定时器代替HAL_Delay延时函数
    因为不知道的原因SysTick_Handler不进入中断,HAL_IncTick函数中的uwTick计数值不能自增,延时函数卡死。用定时器代替系统时钟计数,并重写HAL_Delay延时函数。不使用中断。需要找一个32位计数周期的定时器,才能和32位计数值匹配。我选择的TIM2,STM32H750的TIM2挂载在APB1上,时钟树设......
  • 洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员
    原题链接:https://www.luogu.com.cn/problem/P1314题意解读:计算m个检验值之和,计算与s差值绝对值的最小值。解题思路:1、首先要搞懂检验值是如何计算的如上图,对于每一个区间的检验值yi,表示为:yi="该区间重量>=W的矿石个数" ✖️"该区间>=W的矿石价值之和"检验值y即所有yi(1<=......
  • 【C++】再探构造函数 - 初始化列表详解
    ......
  • Python - 如何使用存储在类变量中的类型作为同一类方法的参数的类型提示?
    考虑下面的代码:fromtypingimportProtocol,ClassVar,AnyclassTool(Protocol):t:ClassVar#deff(self,params:self.t)->Any:#NameError:name'self'isnotdefineddeff(self,params)->Any:passclassSum:......
  • 题解:AT_arc116_e [ARC116E] Spread of Information
    题目链接思路看到最大值最小首先可以想到二分,发现答案具有单调性,那么思考如何在\(O(n)\)的时间内判断是否合法。考虑贪心,在最远没覆盖的点的距离和要判断的\(mid\)刚好相等的时侯再选择一定不劣,因为这样覆盖的点最多,那么从叶子节点向上回溯,处理它的所有儿子,判断是否选择该......
  • 深入探讨Spring Boot中的参数传递
    深入探讨SpringBoot中的参数传递在SpringBoot开发中,参数传递是一个非常常见且重要的操作。无论是处理HTTP请求,还是在方法之间传递数据,理解和掌握参数传递的各种方式都能让我们的代码更加简洁和高效。今天,我们就来深入探讨一下SpringBoot中的参数传递。1.基础知识:HTTP请求参......
  • 一个 put 端点是否有可能在 fastapi、pydantic 上拥有超过 1 种类型的参数
    因此,首先,这个问题的目标是获得更多有关是否可能以及害虫做法的知识。有3种类型的用户7、6为普通用户5,4是出版商3,2是经理1是admin我使用此函数来专用user_role这是第一个问题我会经常使用这个函数,我想了一下,我可以将user_role添加到JWT令牌,但我认......
  • Mysql常用函数
    1、FIND_IN_SETFIND_IN_SET()是一个MySQL中的字符串函数,用于在一个由逗号分隔的字符串列表中查找指定字符串的位置。如果找到了指定的字符串,FIND_IN_SET()将返回该字符串在列表中的位置(索引值)。如果没有找到,它将返回0。其语法如下:FIND_IN_SET(str,strlist)str:......
  • 如何将unicode编码为字节,以便可以检索到原始字符串?在Python 3.11中
    在python3.11中,我们可以对字符串进行编码,如:string.encode('ascii','backslashreplace')这对于说:hellö=>hell\\xf6但是当我插入时hellöw\\xf6rldIgethell\\xf6w\\xf6rld(注意第二个有一个看起来像字符转义序列的文字部分)......
  • AT_arc116_e [ARC116E] Spread of Information 题解
    题目传送门前置知识二分答案|树形DP解法答案显然具有单调性,考虑二分答案。设当前二分出的答案为\(mid\),则等价于覆盖距离为\(mid\)的情况下进行选点。做法同luoguP3942将军令,考虑进行贪心,对于深度最深的叶节点将选择的点放在边界时,即取\(mid\)级祖先时,覆盖的范......