Python-函数入参和全局变量

0 前言

>>返回Python系列文章目录<<

1 函数入参

1.1 位置参数

Python函数的位置参数和其他语言一样,实参和形参的顺序和数量必须完全一致。但是因为Python是动态语言,对入参没有数据类型检查

def sum(a,b):
    s=0
    s=a+b
    return s

s=sum(1,2)  #必须要给a,b参数赋值,不然报错
print(s) #结果为3

1.2 默认参数

默认参数就是在定义函数的时候给变量一个默认值,调用该函数时,如果没有赋值,就使用默认值

默认参数必须在所有位置参数之后,只有当Python对应好所有位置参数后,才将剩下的作为默认参数

def sum(a=10,b=8):
    s=0
    s=a+b
    return s

#调用方式1:给a,b传入参数10,20
s2=sum(10,20)
print(s2)  #打印结果:30

#调用方式2:给a传入100,b不赋值
s3=sum(100)
print(s3) #打印结果:108

#调用方式3:不给变量赋值,a,b使用默认值10和8
s1=sum()
print(s1)  #打印结果:18

1.3 可变参数

当函数设计时不确定会输入多少个参数,可使用可变参数,函数将所有入参打包为一个元组使用

可变参数习惯上都命名为*args,在函数内部使用时,将args视为元组

Python中可使用*将序列型数据拆解成多个变量,因此,有时会看将*var型的实参

def sum(*args):
    s=0
    for x in args:
        s=s+x
    return s

s1=sum(10,20)
print(s1) #打印结果:30

a = 10
b = 20
s2=sum(a, b)
print(s2) #打印结果:30


a = [10, 20]
s3=sum(*a)  # 序列拆解
print(s3) #打印结果:30

1.4 关键字参数

关键字参数允许在调用时以key=value形式传入0个或多个参数

关键字参数习惯上都命名为**kwargs,在函数内部使用时,将kwargs视为字典。对字典进行遍历,相当于对字典的key进行遍历

def sum(**kwargs):
    s = 0
    for k in kwargs:
        s = s + kwargs[k]
    return s
        
#写法1:传入键值 K:V形式
s = sum(num1=10, num2=20)
print(s)  #打印结果: 30

1.5 命名关键字参数

命名关键字参数在关键字参数的基础上限制传入的的关键字的变量名,在输入参数时,必须带有参数名

def divide(num1, num2):
    return num1/num2
        
s = divide(num1=20, num2=10)
print(s)  #打印结果: 2.0

s = divide(num2=20, num1=10)
print(s)  #打印结果: 0.5

命名关键字参数在函数定义时表达方式和默认参数完全一致,为帮助编辑器区分,命名关键字参数必须写在所有位置参数和默认参数后面,中间只要有一个*分割(如果没有*args**kwargs,则必须手动补一个*

# args是变长参数,而city和job是命名关键字参数
def sum(name, age, *, city, job):
	# code

sum(10, 20, city=30, job=40)

2 不可变参数和可变参数

Python中将数据类型分为不可变参数和可变参数

2.1 不可变参数

不可变参数包括数值字符串元组类型数据,具有以下特性:

  • 变量在new=old赋值时,新变量会开辟一片新的内存存放值,对新变量的改动不影响老变量,使用new == old返回False
  • 不可变参数作为函数入参时,同赋值操作一样,开辟新的内存,函数内入参和函数外没有关系
def test(x):
    x = x + 1
        
x = 0
test(x)
print(x)  #打印结果:0
def test(x):
    x = x + 'b'
        
x = 'a'
test(x)
print(x)  #打印结果: 'a'
def test(x):
    x = 0
        
x = (1, 2)
test(x)
print(x)  #打印结果: (1, 2)

2.2 可变参数

可变参数包括列表集合字典类型数据,具有以下特性:

  • 变量在new=old赋值时,新变量和老变量指向同一个内存地址,对新变量的改动会影响老变量,使用new == old返回True
  • 可变参数作为函数入参时,同赋值操作一样,操作同一片内存,函数内入参和函数外有关系
def test(x):
    x.append(3)
        
x = [1, 2]
test(x)
print(x)  #打印结果: [1, 2, 3]
def test(x):
    x.add(3)
        
x = {1, 2}
test(x)
print(x)  #打印结果:{1, 2, 3}
def test(x):
    x.update({'c':3})
        
x = {'a':1, 'b':2}
test(x)
print(x)  #打印结果:{'a': 1, 'b': 2, 'c': 3}

3 全局变量

3.1 使用本文件中全局变量

全局变量定义在import下面,函数中使用到的全局变量只是作为引用,不在函数中修改它的值的话,不需要加global关键字。如:

a = 1
b = [2, 3]

def func():
    if a == 1:
        print("a: %d" %a)
    for i in range(4):
        if i in b:
            print("%d in list b" %i)
        else:
            print("%d not in list b" %i)

if __name__ == '__main__':
    func()

修改全局变量,需要使用global声明,所以通常定义一个函数,专门用来修改全局变量

num = 1

# 定义一个函数,修改全局变量
def set_num(value):
    global num
    num = value

3.2 使用下层文件的全局变量

本文件定义的全局变量无法被其它文件访问,只能提供get/set方法来变相传递

test1.py中的代码:

# 定义全局变量
num = 1

# 设置变量值
def set_num(p):
    global num
    num = p
 
# 获取变量值
def get_num():
    return num

test2.py中的代码:

import test1
 
# 借助方法来访问其它文件中的变量
def get_int():
    n = test1.get_num()
    test1.set_num(10)
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值