python中的函数

一.函数概述
不管什么样子的函数,都可以用下图概括:
在这里插入图片描述
我们已经接触过多个函数,比如 input() 、print()、range()、len() 函数等等,这些都是 Python 的内置函数,可以直接使用。编程语言中的函数,都可以用下图概括:
在这里插入图片描述
从实现函数的角度来看,其至少需要想清楚以下 3 点:
1.函数需要几个关键的需要动态变化的数据,这些数据应该被定义成函数的参数。
2.函数需要传出几个重要的数据(就是调用该函数的人希望得到的数据),这些数据应该被定义成返回值。
3.函数的内部实现过程。

#0.常用的内置函数 max,min,sum,divmod
#函数必须有输入和输出
max_num = max(1,2,3)
print(max_num)

二.函数创建和调用
1)函数的创建
从理论上说,不用函数,也能够编程,我们在前面已经写了程序,就没有写函数,当然,用python的内建函数姑且不算了。现在之所以使用函数,主要是:
1. 降低编程的难度(分而治之的思想)
2. 代码重用。避免了重复劳动,提供了工作效率。
定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具。定义函数需要用 def 关键字实现
定义一个什么事也不做的空函数,可以用 pass 语句;pass 可以用来作为占位符,还没想好怎么写函数的代码,就可以先放一个 pass ,让代码能运行起来。

 1. 如何创建函数?定义函数,函数内容并不会执行
#函数的专业输入叫参数,函数的输出叫返回值
#重点:
#   - 形参:形式参数,不是真实的值(定义函数时的参数)
#   - 实参:实际存在的参数,是真实的值(调用函数时的参数)
def get_max(num1,num2): #形参
    result = num1 if num1>num2 else num2
    return  result

2)函数的调用
调用函数也就是执行函数。如果把创建的函数理解为一个具有某种用途的工具,那么调用函数就相当于使用该工具。
函数调用的基本语法格式: 函数名([形参值])

 如何调用函数?
max_num = get_max(30,80) #实参
print(max_num)

三.变量作用域
变量可分为局部边浪和全局变量
在这里插入图片描述
局部变量,就是在函数内部定义的变量
不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
在这里插入图片描述
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量。
在函数外边定义的变量叫做全局变量
全局变量能够在所有的函数中进行访问
如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的
小技巧: 强龙不压地头蛇(就近原则)
问题:不使用global声明全局变量时不能修改全局变量?
global的本质是声明可以修改全局变量的指向, 即变量可以指向新的数据。
1). 不可变类型的全局变量: 指向的数据不能修改, 不使用global时无法修改全局变量。
2). 可变类型的全局变量: 指向的数据可以修改, 不使用global时可以修改全局变量。
Python 提供了如下三个工具函数来获取指定范围内的“变量字典”:
globals():全局范围内所有变量组成的“变量字典”。
locals(): 当前局部范围内所有变量组成的“变量字典”。
vars(object):获取在指定对象范围内所有变量组成的“变量字典”。如果不传入object 参数,vars() 和 locals() 的作用完全相同。

"""
可变数据类型:list,字典,集合
不可变数据类型:数值,str,tuple
"""
#1. 全局变量:全局生效的变量
def login():

    print(name)
name='admin'
login()

#2.局部变量:局部生效的变量,函数内部的变量
def logout():
    age = 19     #局部变量
    print(age)
logout()
#print(age)   #报错:NameError: name 'age' is not defined

#3.函数内部修改全局变量
#3-1)money是全局变量还是局部变量?全局
#3-2)如果在函数中修改全局变量,不能直接修改,需要用关键字global关键字声明变量是全局变量
#3-3)可变数据类型修改全局变量一定要global声明,可变数据类型不需要。
def hello():
    global money
    money+=1
    users.append('user1')
    print(money,users)
money  = 100 #不可变数据类型
users = []  #可变数据类型
hello()

四.函数参数传递
参数可分为形参与实参
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”
在这里插入图片描述
调用函数时,如果参数个数不对,Python 解释器会自动检查出来,并抛出 TypeError;
如果参数类型不对,Python 解释器就无法帮我们检查。
数据类型检查可以用内置函数 isinstance 实现

2.参数检查  isinstance(var,int)  判断变量var的类型是否为整型

def get_max(num1:int,num2:int)->int:
    if isinstance(num1,int) and isinstance(num2,int):
        return num1 if num1>num2 else num2
    else:
        return 0
result = get_max(20,3.1)   ##会有提示说明参数类型
print(result)

常见的四类形参:
常见的形参包括必选参数,默认参数,可变参数和关键字参数

"""
必选参数:必须要传递的参数
默认参数
可变参数:元组
关键字参数:字典
"""
#1.必选参数:必须要传递的参数
def get_max(num1:int,num2:int)->int:
    return num1 if num1>num2 else num2

result = get_max(20,3.1)   ##会有提示说明参数类型
print(result)

#2.默认参数:可传可不传的参数
def pow(x,y=2):
    return x ** y
result = pow(2)    #x=2,y=2
print(result)    #4
result = pow(2,4)  #x=2,y=4
print(result)   #16

#3. 可变参数:参数的个数会变化,可以传1,2,3,...,n个值
#args=arguments
#args是元组
def my_sum(*args):
    return sum(args)
result = my_sum(1,2,3)
print(result)

#4.关键字参数:可以传递key和value
#kwargs存储在字典中
def enroll(name,age=18,**kwargs):
    print(f"""
        入学信息
    1.姓名:{name}
    2.年龄:{age}
    3.其他:{kwargs}
    """)
enroll('张三',country='china',english='GRE',sports=['篮球','羽毛球'])

参数组合
参数组合是指可以必选参数、 默认参数、 可变参数和关键字参数一起使用。
参数定义的顺序必须是:必选参数、 默认参数、可变参数和关键字参数。
在这里插入图片描述

五.匿名函数
匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。(省略了用def声明函数的标准步骤)

"""
   匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,
只需用表达式而无需申明。(省略了用def声明函数的标准步骤)
lambda函数能接收任何数量的参数但只能返回一个表达式的值

"""
#def get_max(num1:int,num2:int)->int:
#    return num1 if num1>num2 else num2
get_max = lambda  num1,num2: num1 if num1>num2 else num2
print(get_max(10,20))

六.递归函数
什么是递归函数
一个函数在内部调用自己本身,这个函数就是递归函数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值