最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

python基础学习函数式编程[二]

XAMPP案例 admin 51浏览 0评论

全局变量和局部变量

1、全局变量

  • 在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块 结束。
  • 全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
  • 全局变量一般做常量使用。
  • 函数内部要改变全局变量的值,使用 global 声明一下

2、局部变量

  • 在函数体中(包含形式参数)声明的变量。
  • 局部变量的引用比全局变量快,优先考虑使用。
  • 如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量。

函数参数的传递

函数的参数传递本质上就是:从实参形参的赋值操作。

Python 当中“一切皆对象”, 所有的赋值操作都是“引用的赋值”。所以,Python 中参数的传递都是“引用传递”,不是“值传递”。

 

  • 对“可变对象”进行“写操作”,直接作用于原对象本身。
  • 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”)

可变对象有:字典、列表、集合、自定义的对象等

- 不可变对象有:数字、字符串、元组、function 等

dz0085Python

1. 传递可变对象的引用

传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的引用,这算是个难点吧,其实也就是个细节问题,会经常在各种面试题里看到。
在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。
举个栗子:
l = [10, 20]


def func(m):
    print("m:", id(m))  # l 和 m 是同一个对象
    m.append(30)  # 由于 m 是可变对象,不创建对象拷贝,直接修改这个对象


func(l)
print("l:", id(l))
print(f'l : {l}')

结果:
# m: 2149956976328
# l: 2149956976328
# l : [10, 20, 30]
Tips:定义一个列表,在函数里面修改它,会发现调用函数之后列表的内容也会修改。

2. 传递不可变对象的引用

传递参数是不可变对象(例如:int、float、字符串、元组、布尔值),实际传递的还是对象的引用。
在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。。
举个栗子:
a = 100


def func(n):
    print(f"n's id: {id(n)}")  # 传递进来的是 a 对象的地址
    n += 200  # 由于 a 是不可变对象,因此创建新的对象 n
    print(f"n's id: {id(n)}")  # n已经变成了新的对象
    print(f'n : {n}')


func(a)
print(f'a : {a}')
print(f'a : {id(a)}')

# 结果:
# n's id: 1752725632
# n's id: 2346697530128
# n : 300
# a : 100
# a : 1752725632
Tips:结果很明显:显然,通过 id 值我们可以看到 n 和 a 一开始是同一个对象。给 n 赋值后,n 是新的对象。
图片

函数参数的几种类型

1. 位置参数

函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。按位置传递的参数,称为:“位置参数”。

For example:

def user_info(name, age, gender):
    print(f'your\'s name is {name}, age is'
          f' {age}, gender is {gender}')


user_info('tom', 20, 'male')
user_info('male', 20, 'tom')  # 错误传递的后果

# 结果:
# your's name is tom, age is 20, gender is male
# your's name is male, age is 20, gender is tom

Tips:没什么好说的,别传错了就行。

2. 默认值参数

我们可以为某些参数设置默认值,这样这些参数在传递时就是可选的。称为“默认值参数”。 默认值参数放到位置参数后面。

def f1(a,b,c=10,d=20): 
  #默认值参数必须位于普通位置参数后面 
  print(a,b,c,d) 


f1(8,9) 
f1(8,9,19) 
f1(8,9,19,29)

结果:
8 9 10 20 
8 9 19 20 
8 9 19 29

3. 关键字参数

user_info(age=20, gender='female', name='Wang')

结果:
user_info(age=20, gender='female', name='Wang')

4. 不定长度参数

  • *param(一个星号),将多个参数收集到一个“元组”对象中。
def user_infomation(*args):
    print(args)


user_infomation('TOM')
user_infomation('TOM', 18)  # 接受任一参数,返回一个元组

结果:
('TOM',)
('TOM', 18)
  • **param(两个星号),将多个参数收集到一个“字典”对象中。
def user_infomation1(**kwargs):
    print(kwargs)


user_infomation1(name='TOM', age=20)  # 返回一个字典

结果:
{'name': 'TOM', 'age': 20}

5. 函数参数类型总结

总结就是参数的类型很多,实际使用过程中也会碰到各种各样的问题,包括它的顺序,关键字以及是否获取的是可变类型的参数等等。初学的时候会有点乱,多写多练,总会掌握的比较扎实的。

写在最后

本节给大家介绍了Python语法中的函数的参数及参数传递。内容较为枯燥,但是用途甚广!!!勤能补拙是良训,希望大家还是动手做一做,有问题可以私信我,欢迎交流和提出您的宝贵意见。

你要偷偷学Python,然后惊艳所有人。

转载请注明:XAMPP中文组官网 » python基础学习函数式编程[二]