8.作用域与函数

1.局部变量与全局变量:
局部:在函数体或局部范围内声明的变量称为局部变量,仅在局部作用域内有效.
全局:在函数之外或全局范围内声明的变量,允许在函数内部和外部访问.不允许在函数内部修改.
2.global:用于在函数内部访问和修改全局作用域中的变量,通过在函数内部使用global关键字声明变量,该变量就可以在函数内部被修改,并且修改后的值也会影响到全局作用域中的变量.

def func():
    a = 1000
    print("内部",a)

a = 200
func()
print('外部', a)

global

a = 10


def func():
    global a
    a = 20


print(a)
func()
print(a)

3.nonlocal:用于在嵌套函数中修改嵌套作用域外的变量,它允许你在内部函数中访问并修改外部函数的局部变量,不是创建一个新的同名局部变量,并且会影响到外部函数中的同名变量.这样可以实现在嵌套函数中共享和修改变量的目的

def outer():
    x = 'local'

    def inner():
        nonlocal x
        x = 'nonnlocal'
        print('inner', x)

    inner()
    print('outer', x)


x = 'global'
outer()
print('global', x)

4.函数参数的传递
强制位置参数func(a, b, /):
强制关键字参数:func(a, *, b) *后面的强制使用关键字参数
位置参数:调用函数时根据函数定义的参数的位置来传递参数.
关键字参数: 函数调用通过key=value的形式来传递参数, 可以让函数更加的清晰, 同时也不需要强调顺序.
缺省参数:也叫做默认参数, 用于在定义函数的时候为参数提供默认值, 调用函数时可以不传递该参数的值, 所有的位置参数必须出现在默认参数前, 包括函数定义和调用.
不定长参数:不定长参数: 也叫做可变参数, 用于不确定调用的时候会传递多少参数.二者可以混用
func(*args,**kwargs):
*args 位置传递,会以元组存储被args接收
**kwargs,关键字传递,在参数是key=value的情况下, 所有的key-value都会被kwargs接收, 同时会将key-value组成一个字典.

def self_introduction(*args,**kwargs):
    print(args)
    print(kwargs)
    print(f"你好, 我的名字叫{args[0]}, 今年{kwargs['age']}岁, 我来自{kwargs['come_from']}")


a = self_introduction('王五', age=18,come_from='广西')
print(a)

5.值传递和引用传递
值传递将实际参数复制一份给形参,不影响实际参数的值.
引用传递,将实际参数的引用地址传递给形式参数,形式参数和时间参数指向同一内存地址,函数中对形式参数的修改会影响到实际参数.
对于可变对象(列表,字典),传递方式是引用传递,因为他们的值可以在函数内部进行修改,对于不可变对象(数字,字符串),传递方式是值传递,函数内部对形式参数的修改不会影响到实际参数.

def f(a, b=[]):
    for i in range(a):
        b.append(i)
    print(b)


f(6)
f(7)
f(7,b = [1,2])

lst = lst+5 会创建一个新的 += 则是在原来上面进行操作
把函数作为参数传递
不能传函数的调用,要传引用:

def sorted_by(num):
    num_string = str(num)[-1]
    return int(num_string)

a_list = [12123, 1651 , 16564, 48646]
b_list= sorted(a_list, key=sorted_by)
print(b_list)

6.匿名函数
用于创建一次性的,简单的函数

def add(a, b):
    return a + b

c = lambda a, b: a+b

print(c(1,2))

lambda a, b: a+b

numbers = [5, 8, 9, 4]
a_list = sorted(numbers, key=lambda x:x %3)
print(a_list)

7.常用内置函数
zip打包,返回一个可迭代的对象,该对象生成元组
from itertools import zip_longest
来补充
如果长短不一样,会自动与最短的相配

a_list = [1, 2, 3]
string_list = ['1', '2', '3']
c_list = ['a', 'b', 'c']

zipeed = zip(a_list,string_list,c_list)
print(list(zipeed))

map(function, iterable)
前面是方法函数,

def square(x):
    return x ** 2


numbers = [1,2, 3, 4]
square_numbers = map(square, numbers)
print(list(square_numbers))

filter(function, iterable)对可迭代元素进行过滤
函数是过滤后的

numbers = [1,2, 3, 4]
def is_even(x):
    return x %2 == 0


even_numbers = filter(is_even, numbers)
print(list(even_numbers))

all(iterable)判断可迭代对象中所有元素是否都为真.
如果为真返回True,否则False,空的话也返回True

numbers = [1, 2, 3, 4, 5]
sign = all(num > 0 for num in numbers )
print(sign)

any(iterable)
判断可迭代对象中的任何一个元素是否为真,不是返回False
有一个为True返回True,如果是空的会返回False

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值