一、变量作用域和多函数执行流程

1.1 变量作用域

解释说明:变量作用域指的是变量生效的范围,主要分【局部变量】和【全局变量】

  • 局部变量
# 在一个函数内部声明的变量,只能在这个函数内部访问,在此函数外部无法访问的叫局部变量
def f1():
    a = 10
    print(a)
f1()
# 运行结果为 10
  • 全局变量
""" 全局变量 1. 函数内部不能直接访问全局变量, """
age = 20
def f1():
    global age # 告诉函数内部,操作的是全局变量 age
    age = 30  # Python 解释器会认为 i 在 f1 函数内部又声明了一个叫做 age 的变量,值为30
    print(f'函数内部打印age:{
     age}')
f1()
print(age)

1.2 多函数执行流程

  • 共用全局变量
glo_num = 0
def test1():
    global glo_num  # 修改全局变量
    glo_num = 200
def test2():
    # 调用 test1 函数中修改后的全局变量
    print(glo_num)  # 结果为 200
test1()  
test2()
  • 返回值作为参数传递
def f1():
    return 10
def f2(a):
    print(a)  # 结果为 10
# 将 f1() 函数存在一个变量中
result = f1()
# 将变量作为参数传递给 f2()函数
f2(result)

二、函数的参数

2.1 位置参数

解释说明:根据形参和实参的位置顺序(从左往右),将实参赋值给形参。

def f1(a,b,c,d):
    print(a)  # 结果为 10

f1(10,5,6,49)
# 注意: 传递和定义参数的顺序及个数必须一致

2.2 关键字参数

举个例子大家就看的很清晰了

def f1(a,b,c,d):
    print(a)  
    
# 位置参数
f1(10,5,6,49)

# 关键字参数
f1(c = 20,a = 6, b = 33, d = 100)

# 位置参数和关键字参数结合,位置参数要放在关键字参数的前面
f1(10,c = 66, b = 26, d = 8)

2.3 不定长参数

  • 包裹位置传递

????这名字是什么意思呢

def f2(*args):
    print(args)

f2(10)   # 结果 (10,)
f2(10, 200) # 结果 (10, 200)
f2(4, 5, 6, 7, 88, 9, 0) # 结果 (4, 5, 6, 7, 88, 9, 0)
# 注意: 传进的所有参数都被 args 变量收集,它会根据传进参数的位置合并为一个元组(tuple), args 是元组类型。
  • 包裹关键字传递
def f3(**kwargs):
    print(kwargs)

f3(name = ' zcc',age = 18)  # 结果为 {'name': ' zcc', 'age': 18}
# 可见 包裹关键字传递 返回的是一个字典

三、拆包和交换变量值

3.1 拆包

t1 = ('a','b','c','d',10,20)

""" 声明6个变量,将元组中的6个元素分别赋值给6个变量 """
n1 = t1[0]
n2 = t1[1]
n3 = t1[2]
n4 = t1[3]
n5 = t1[4]
n6 = t1[5]
n1, n2, n3, n4, n5, n6 = t1[0], t1[1], t1[2], t1[3], t1[4], t1[5]
# 拆包
n1, n2, n3, n4, n5, n6 = t1
print(n1, n2, n3, n4, n5, n6)  # a b c d 10 20

# 拆包应用 - 元组拆包
def f1():
    return 10, 20

n1, n2 =f1()
print(n1, n2)  # 10 20

# 字典拆包
dict1 = {
   'name': 'tom','age': 18}
a, b = dict1
print(a,b)
print(dict1[a])  # name age

3.2 交换变量值

# python 独有的交换两个变量的值
a = 10
b = 20
a, b = b, a
print(a,b)  # 20 10

四、任务清单

4.1 基础练习

  1. 写函数,接收n个数字,求这些参数数字的和
def f1(*args):
    print(sum(args))
f1(1,2,50,30,15,66,100)
  1. 定义一个函数,接受一个列表作为参数,找到这个列表中下标为奇数对应的元素,放到一个新列表中,并将其作为返回值返回
def f1(list1):
    list2 = [list1[i] for i in range(len(list1)) if i % 2 != 0]
    return list2

print(f1(['你','笑','起','来','真','好','看']))
  1. 写一个函数,判断用户传入的列表长度是否大于2,如果大于2,只保留前两个,并将新内容返回给调用者,否则就返回原列表
def f1(list1):
    if len(list1) > 2:
        return list1[:2]
    else:
        return list1
print(f1(['你','笑','起','来','真','好','看']))
  1. 写函数,统计字符串中有几个字母,几个数字,几个空格,几个其他字符,并将这几个返回结果
def f1(str_num):
    letter = 0
    num = 0
    space = 0
    other = 0
    for i in str_num:
        if i.isalpha():
            letter += 1
        elif i.isdigit():
            num += 1
        elif i.isspace():
            space += 1
        else:
            other += 1
    return  f'字母:{
     letter}个,数字:{
     num}个,空格:{
     space}个,其他字符:{
     other}个'
print(f1('gsj 32&&@ aj'))
  1. 写函数,接收两个数字参数,返回比较大的数字
def f1(num1,num2):
    return num1 if num1 > num2 else num2
print(f1(10,20))
  1. 写一个函数完成三次登陆功能
def f1(user_name,pwd):
    if user_name == 'admin' and pwd == '111111':
        return True
    else:
        return False
i = 0
while True:
    user_name = input('请输入用户名:')
    pwd = input('请输入密码:')
    res = f1(user_name,pwd)
    if res == False:
        print('用户名或密码错误')
        i += 1
        if i == 3:
            print('抱歉,您已超过限制三次')
            break
    else:
        print('登录成功')
        break
  1. 编写一个函数,接受3个数字作为参数,计算3个数字大小,并按从大到小输出3个数字
def f1(*args):
    list1 = list(args)
    list1.sort(reverse=True)
    for i in list1:
        print(i)
f1(10,66,6)

4.2 提升练习

  1. 编写函数,用于生成验证码,验证码有0-9的数字和 a-z,以及 A-Z 之间的字母组成,验证码长度为6位,将生成的验证码作为返回值返回
import random
def f1():
    list1 = [i for i in range(10)]
    list2 = [chr(i) for i in range(65,91)]
    list3 = [chr(i) for i in range(97,123)]
    list_code = list1 + list2 + list3
    code = ''
    for i in range(6):
        index = random.randint(0,len(list_code)-1)
        code += str(list_code[index])
    return code
print(f1())
  1. 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换,请编写一个函数,传入原文,输出密文
def f1(number):
    list1 = []
    for i in number:
        num1 = (int(i) + 5) % 10
        list1.append(num1)
    list1.reverse()
    for i in list1:
        print(i,end='')
f1('1654')

总结