1.局部变量与全局变量:
局部:在函数体或局部范围内声明的变量称为局部变量,仅在局部作用域内有效.
全局:在函数之外或全局范围内声明的变量,允许在函数内部和外部访问.不允许在函数内部修改.
2.global:用于在函数内部访问和修改全局作用域中的变量,通过在函数内部使用global关键字声明变量,该变量就可以在函数内部被修改,并且修改后的值也会影响到全局作用域中的变量.
def func():a = 1000print("内部",a)a = 200
func()
print('外部', a)
global
a = 10def func():global aa = 20print(a)
func()
print(a)
3.nonlocal:用于在嵌套函数中修改嵌套作用域外的变量,它允许你在内部函数中访问并修改外部函数的局部变量,不是创建一个新的同名局部变量,并且会影响到外部函数中的同名变量.这样可以实现在嵌套函数中共享和修改变量的目的
def outer():x = 'local'def inner():nonlocal xx = '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 + bc = lambda a, b: a+bprint(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 ** 2numbers = [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 == 0even_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