浅尝python 四

四、函数高级操作

1、局部变量和全局变量

1.1、可变类型与不可变类型

数据类型,整数(int),浮点数(float),布尔(bool),字符串(str),列表(list),元组(tuple),字典(dict)
划分标准:内存中数据是否允许被修改,允许被修改的 可变,否则 不可变【简单的判断标准:不使用等号,能否改变数据值】

  • 可变:
    列表list, 列表.append()
    字典dict , 字典.pop()
    集合
  • 不可变
    整型 int
    浮点型 float
    字符串str
    元组tuple
    布尔bool

1.2、局部变量 和全局变量

  • 局部变量
    1在函数内部定义的变量,即为局部变量,
    2 、不同函数中,可定义相同的局部变量 ,特点:局部变量的作用域为函数内部;生命周期 为函数被调用的时候创建,调用结束 在内存中被删除销毁
    3、一般的形式参数,可被认为是局部变量
  • 全局变量
    1 、在函数外部定义的变量,特点:全局变量的值可以在任意函数中使用(读取)
    2、想在函数中修改全局变量的引用,需要使用global关键字声明
    3、函数内部,如果有局部变量和全局变量名称相同,在函数中默认使用以局部变量为准(就近原则)
    4、 生命周期:执行代码的时候创建,执行结束即被销毁(生命周期为代码的整个运行期间)
demo1

在引用工具的模块里定义全局变量

globale_num = 10
定义函数:
def func1():
    print(globale_num)

def func3():
    global globale_num  # 声明使用全局变量
    globale_num = 30  # 给全局变量赋值
    print(globale_num)
def func2():
    globale_num = 20  # 局部变量,不影响全局变量的值
    print(globale_num)
if __name__ == '__main__':
    func1()  # 10
    func2()  # 20
    func1()  # 10
    func3()  # 30
    func1()  # 30
    func2()  # 20
    globale_num = 40
    func1()  # 40
输出:
10
20
10
30
30
20
40
demo2
my_list = [1]


def func4():
    print(my_list)


def func5():
    my_list.append(123)


def func6():
    my_list = [10, 20]  # 局部变量


def func7():
    global my_list
    my_list = [222, 333]


if __name__ == '__main__':
    func4()  # [1]
    func5()
    func4()  # [1,123]
    print(my_list)  # [1,123]
    func6()
    func4()  # [1,123]
    func7()
    func4()  # [222, 333]
输出:
[1]
[1, 123]
[1, 123]
[1, 123]
[222, 333]

2、传参和返回值

2.1、函数传参的方式有3种

def func(a, b, c):
    print(f'a={a},b={b},c={c}')
2.1.1、位置传参
func(1, 2, 3)
2.1.2、关键字传参

【注意,关键字传参,变量名必须和函数定义变量名保持一致,否则报错】

func(a=1, b=2, c=3)
2.1.3、混合使用

关键字传参,数据必须写在位置传参的后边,【注意,关键字传参,变量名必须和函数定义变量名保持一致,否则报错】

func(1, b=12, c=14)

2.2、缺省参数

缺省参数:定义函数时,给某个参数指定一个默认值,具有默认值的参数
说明:调用函数时如果没有传入缺省参数的值,责使用默认值。
书写位置要求:缺省(默认)参数,必须写在普通参数的后边
def print(self, *args, sep=’ ‘, end=’\n’, file=None): 表示给型参一个默认的值,不填写就表示\n

def show_info(name, age=15, sex='猜'):  # 表示默认值,如果传就按实参传进来的值,如果不传,就按照函数定义这里的默认参数值
    print(f'name={name},age={age},sex={sex}')
show_info('小明', 18, '女')
show_info('小明1')
show_info('小明2', 17)
show_info('小明1', sex='男的')  # 缺省参数不止1个,可以使用关键字进行传参,ps:缺省参数必须放在普通参数后边
输出:
name=小明,age=18,sex=女
name=小明1,age=15,sex=猜
name=小明2,age=17,sex=猜
name=小明1,age=15,sex=男的

2.3、多值参数

多值参数,也称为可变参数,不定长参数,在函数定义的时候,不确定参数有多少个
在一个普通参数前边,加一个 * ,这个参数就变为不定长参数
特点:可以接收任意多个位置传参的数据,类型为元组
一般写法:一般将这个参数的名字写作args(arguments),加上 * 变为 *args
eg: print 函数中,就有可变参数/不定长参数/多值参数 *args ,args为元组类型

print(1)
print(1, 2)
print(1, 2, 3)
  • 函数参数的顺序:默认值参数

def 函数( 普通参数 , *args , 缺省参数 ):

def func(a, *args, c=100):
    print(f'a:{a},args:{args},c:{c}')
func(1)  # a:1,args:(),c:100
func(1, 3, 5)  # a:1,args:(3, 5),c:100
func(1, 3, 5, c=5)  # a:1,args:(3, 5),c:5

输出:

a:1,args:(),c:100
a:1,args:(3, 5),c:100
a:1,args:(3, 5),c:5
demo

定义一个函数,可以对任意多数字加和运算并输出

def mySum(*args):  # args 默认为元组类型
    pass
    initV = 0
    for i in args:
        initV += i
    print(initV)

运算test1:

mySum()
mySum(1)
mySum(1, 2)
mySum(1, 2, 3)

输出:
0
1
3
6

运算test2:

# 多值参数应用-求和
my_list = [1, 2, 3]
my_tuple = (1, 7, 2)
# 以下为特殊的拆包
mySum(*my_list)  # 函数传参过程中的拆包
#  或者 mySum(my_list[0],my_list[1],my_list[2])
mySum(*my_tuple)

输出:
6
10

2.4、函数返回多个数据值

函数中返回数据值使用return
return 的作用,1⃣️ 返回数据值,2⃣️ 结束函数的运行
想要返回多个数据值,只需要将多个数据值变成容器(一般是元组)返回即可

demo
def calc(a,b):
    return a+b,a*b

calRs=calc(1,2)
print(calRs)

x,y=calc(3,1)
print(x,y)
输出:
(3, 2)
4 3

3、匿名函数

3.1、匿名函数

匿名函数,是指使用lambda关键字定义的函数
匿名函数,只能实现简单的功能,只能写一行代码

主要应用 :

  • 1、一般不主动调用,而是作为函数的参数,在函数内部调用,也可以使用def定义的函数作为函数的参数
  • 2、若想要在函数外部调用,可以使用变量 保存匿名函数,调用形式: 变量 = lambda 参数:一行代码 【ps:变量相当于函数名】,使用变量形式 : 变量(参数)
demo1、 定义一个匿名函数,求两个数的乘积(两个参数)
lambda x,y:x*y

想要调用匿名函数,需要使用变量保存

# 如果想要调用匿名函数,需要使用变量保存,调用方式为: 变量名(参数),如下
func =lambda x,y:x+y
print(func(1,2))
输出:
3
demo2、定义一个匿名函数,获取字典中 键为 age对应的值(参数 一个 字典)
lambda dictParam={'age': 12, 'name': 'tom'}: dictParam.get("age")

调用lambda 定义的匿名函数,使用变量保存

fun1 = lambda dictParam={'age': 12, 'name': 'tom'}: dictParam.get("age")
print(fun1(dictParam={'age': 18,'name':'tom'}))
输出:
18

3.2、匿名函数应用

常见应用:对列表中的字典排序
user_list=[
    {'name':'tom','age':28,'title':'研发'},
    {'name':'lisa','age':32,'title':'运营'},
    {'name':'jack','age':29,'title':'产品'}
]

按列表中某一元素进行排序

user_list.sort(key=lambda x:x['age'],reverse=True)
print(user_list)
输出:
[{'name': 'lisa', 'age': 32, 'title': '运营'}, {'name': 'jack', 'age': 29, 'title': '产品'}, {'name': 'tom', 'age': 28, 'title': '研发'}]
字符串大小比对

1、单个字符,按字母ask码 比较,eg:A<Z<a<z
2、字符串是按 对应下表位置的字符进行大小比对

  • demo1 、比对字符串大小
print('a'>'ABC')
print('a'>'aAbc')
输出:
True
False
  • demo2、给列表排序
my_list=['a','AB','XYZ','XYabc']
my_list.sort()
print(my_list)
输出:
['AB', 'XYZ', 'XYabc', 'a']

my_list.sort(key=lambda x:len(x),reverse=True)
print(my_list)
输出:
['XYabc', 'XYZ', 'AB', 'a']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值