python基础(九)------函数(中)

目录

1.1函数的参数

1.1.1可变参数

1.1.1.1 *args

1.1.1.2 **kwargs

1.1.2 参数解包

1.2 函数返回值

1.3 作用域与命名空间

1.3.1 作用域

1.3.1.1 全局作用域

1.3.1.2 函数作用域

1.3.2 命名空间

 1.4 练习

1.5 答案解析


1.1函数的参数

1.1.1可变参数

1.1.1.1 *args

定义形参时,在形参前面加 * 号 , 这种形参就可以获得所有的位置实参,将所有的实参都保存到一个 元组中 ★

* : 可以接收所有的实参,并且将实参保存到一个元组中
装包:散开的数据,装到一个元组或字典


def fn(*a):# 将任意个位置参数装成元组
    print('a =',a)

fn(1,2,3)


def su(*a):
    res = 0
    for i in a:
        res += i
    print(res)


su(1)
su(1,2)
su(1,2,3)


1.带 * 号的形参 只能有一个 
2.纯位置参数,带 * 号的参数可以和其他参数混合使用,但是得写最后面
	# 使用关键字参数可以解决第二个问题
3.带*参数的名字,取名一般叫 *args

1.1.1.2 **kwargs

def fn(**kwargs):
    print('kwargs =', kwargs)
    print(type(kwargs))

fn(a=1, b=2, c=3)

》**形参可以接收任意的关键字参数,会将这些参数统一保存到字典里面。字典的键就是参数的名字,字典值就是参数的值
》**形参也是只能有一个,并且写在所有参数最后,它必须是最后一个。潜规则命名:**kwargs

1.1.2 参数解包

》 传递实参时,也可以在序列类型的参数前添加星号,这样会自动将序列中的元素依次作为参数传递

def fn(a, b, c):
    print('a =', a)
    print('b =', b)
    print('c =', c)


t = (1, 2, 3)
# fn(*t)  <==> fn(1,2,3)
fn(*t)  # 实参可以接收任意类型

# 使用解包时候,注意保持序列元素,能够被对应形参接收


def fn(a, b, c):
    print('a =', a)
    print('b =', b)
    print('c =', c)


d = {'a': 10, 'b': 20, 'c': 30}
fn(**d)  # 实参可以接收任意类型
字典的名字必须得和 形参名字相同

序列类型可以解包赋值 =》 得对应数目

1.2 函数返回值

返回值:函数执行以后返回的结果

可以通过 return 来指定函数的返回值

获得返回值的方法:把函数的调用当作一个值



score = [10,20,30,40,50,60]

x = sum(score)
print(f'老师的总分 {x//10}')


return 后面是什么  函数返回结果就是什么
return 后面可以是任意的值
return 只能返回单值


def fn():
    return 1,2,3  # 看似返回多个值,其实也是一个元组


x = fn()
print(x)


# 返回值是函数
def fn():
    def fn2():
        print('h')

    return fn2
r = fn()   # r = fn2
r()


★★★
fn()两种函数:
	1.调用函数
    2.接收的返回值
    
None:代表空值
Python中None是一个特殊的常量(N必须是大写)

# 如果仅仅写一个return,或者说不写reutrn 则等价于 return None
# return代表函数执行结束,后面代码不会再执行


break:退出当前循环
continue:跳过本次循环
return:结束整个函数



fn 和 fn() 的区别

print(fn) # fn是函数对象
print(fn()) #执行fn的代码, 输出返回值

1.3 作用域与命名空间

1.3.1 作用域

作用域:指变量的生效的区域

y = 2
def fn():
    x = 1
    print('函数内部y =',y)
fn()
print("函数外部y =",y)


python作用域一共有两种
1.全局作用域
2.函数作用域

1.3.1.1 全局作用域

全局作用域生命周期:全局作用域在程序执行时创建,在程序执行结束时销毁

》所有函数以外的位置 都是全局作用域

》在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序任意位置访问

1.3.1.2 函数作用域

函数作用域生命周期:函数调用的时候出生,调用结束的时候销毁

def fn():
    a = 10
    print('a =',a)
fn() 
fn()
fn()
一共诞生了3次函数作用域

函数作用域中定义的变量,只能函数内部范围
def fn():
    a = 10
    print('内部a =',a)
print('外部a =',a)

★★★
变量的查找规则:会优先在当前作用域中寻找该变量,如果有就使用,没有则继续往上一级作用域寻找,如果全局都没有,就报错

希望在函数内部修改全局变量,则需要使用  global关键字来声明变量


x = 20


def f():
    global x  # 声明之后,x就是全局变量
    x = 100
f()

print(x)


nonlocal用来在嵌套函数中使用外层(非全局)变量
def f():
    x = 20
    def g():
        nonlocal x
        x += 1
    g()
    print(x)
f()

1.3.2 命名空间

命名空间:变量存储的位置,每一个变量都需要存储到命名空间中

全局作用域 =》全局命名空间 =》全局变量

函数作用域 =》函数命名空间 =》局部变量(或者说是函数中的变量)

命名空间 =》专门存储变量字典

locals(): 获取当前作用域的命名空间。

如果在全局作用域中调用 locals(),获得全局的命名空间

如果在函数作用域中调用 locals(),获得函数的命名空间

x = 1
print(locals()) # 全局命名空间


a = 1
def fn():
    b = 1
    print(locals()) # 函数命名空间
fn()

 1.4 练习

# 注意:前三题要求是 返回值

1.编写一个函数,功能是返回2个数的和 

2.编写一个函数,功能是返回任意个数的和

3.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数

4.
'''
请在下列代码的 四个print后面 
注释分别写上 变量的作用域类型 和 结果值
如
print(b)  # 全局作用域  100
'''

a = 5
c = 20
x = 100


def test(a, b=10):
    print(a)  # 函数作用域  1
    print(b)  # 函数作用域  2
    print(x)  # 全局作用域  100
    c = 50	
    c += 1
    print(c)  # 函数作用域 51


test(1, 2)
print(c)  # 全局作用域  20

1.5 答案解析

# 1.编写一个函数,功能是返回2个数的和
def sum_1(x,y):
    sum=x+y
    return sum

r=sum_1(5,7)
print(r)

# 2.编写一个函数,功能是返回任意个数的和
def sum_2(*args):
    res=0
    for i in args:
        res+=i
    return res
scy=sum_2(1,2,3,7)
print(scy)


# 3.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
# 元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数
def cacluate(*args):
    list=[]
    sum=0
    for i in args:
        sum+=i
        avg=sum/len(args)
    for i in args:
        if i>avg:
            list.append(i)
    return avg,list
scy1=cacluate(1,2,3,4,5,6,7,8,9,10)
print(scy1)
# 4.
'''
请在下列代码的 四个print后面 
注释分别写上 变量的作用域类型 和 结果值
如
print(b)  # 全局作用域  100
'''

a = 5
c = 20
x = 100


def test(a, b=10):
    print(a)   #---------函数作用域 1
    print(b)   #---------函数作用域 2
    print(x)   #---------全局作用域 100
    c = 50
    c += 1
    print(c)   #---------函数作用域 51


test(1,2)
print(c)   #------------结果 20

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,让我们来谈谈 Python 的异常处理。在 Python ,异常是程序在运行时遇到的错误或问题,它会导致程序停止运行并抛出一个异常。为了避免这种情况,我们可以使用 try/except 块来捕获并处理异常。例如: ``` try: # some code that might raise an exception except SomeException: # handle the exception ``` 其,SomeException 是你想要捕获的异常类型。当代码运行到 try 块的代码时,如果出现了 SomeException 异常,那么 except 块的代码就会被执行。 接下来,让我们来谈谈 Python 的对象。在 Python ,一切都是对象,包括数字、字符串、函数等等。对象有一个类型,它定义了对象可以执行的操作。例如,数字类型可以执行加、减、乘等操作,字符串类型可以执行拼接、切片等操作。你也可以创建自己的对象,并定义它们的类型和操作。 最后,让我们来谈谈 Python 的迭代器。迭代器是一种对象,它可以让你逐个访问一个序列的元素。Python 的迭代器是通过 __iter__ 和 __next__ 方法实现的。__iter__ 方法返回一个迭代器对象,__next__ 方法返回序列的下一个元素。例如: ``` class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index >= len(self.data): raise StopIteration result = self.data[self.index] self.index += 1 return result my_iter = MyIterator([1, 2, 3]) for item in my_iter: print(item) ``` 在上面的例子,我们创建了一个名为 MyIterator 的迭代器对象。它有一个 data 属性,表示要迭代的序列,以及一个 index 属性,表示当前迭代的位置。__iter__ 方法返回 self,表示它本身就是一个迭代器对象。__next__ 方法返回序列的下一个元素,并将 index 属性加 1。当迭代器遍历到序列末尾时,会抛出 StopIteration 异常,表示迭代结束。 希望这些信息能够对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值