• python 第四章 函数 (pycharm) (2)


    一 :变量作用域

    变量的作用域就是指在代码中变量能使用的位置

    变量的引用

    1. def func(a):
    2. print(a)
    3. data = 10
    4. func(data) # a=data 参数a引用了data的数据
    5. data2 = 20
    6. func2(data2)

    变量的分类

    • 全局变量

      • 在函数外定义,可以在代码中任意位置使用的变量

    • 局部变量

      • 在函数内定义,在函数内能使用

    1. # 变量引用
    2. data = 10 # 外部的变量值叫做全局变量
    3. def func(data):
    4. # 参数传参引用方式 获取外部的变量值进行计算
    5. # 内部的变量值叫局部变量
    6. data = data+1
    7. print(data)
    8. def func2():
    9. # data没有参数是,当成局部变量,但是此时局部变量data没有被定义会报错
    10. # 通过 global 声明外部变量值作为局部变量使用
    11. global data
    12. data = data+1
    13. print(data)
    14. def func3():
    15. global data
    16. data = data+1
    17. print(data)
    18. def func4(data):
    19. data = data+1
    20. print(data)
    21. func(data)
    22. func4(data)
    23. # func2()
    24. # func3()

    变量的作用域 指的变量能使用的范围

    全局变量 可以代码的任意位置使用

    局部变量 只在当前函数内有效

    在函数内使用全局变量 有两种方式

    第一种 当成参数传参 将全局变量传递给函数参数(函数内的局部变量)

    • 当成参数使用时 则相当于参数引用了全局变量的值,对参数进行操作,不影响全局全局变量的值

    第二种 global声明 在函数内进行使用

    • 在函数内直接操作全局变量,会修改全局变量的值

    1. # 多个函数中都要使用的变量可以定义成全局变量,通过global声明,就可在多个函数就可以共享全局数据
    2. name_list = []
    3. password_list = []
    4. # 登录注册功能
    5. def login():
    6. # 函数作用域
    7. # 通过四个空格,来确认函数所执行的逻辑从哪里开始
    8. # 列表,元组,集合,字典数据可以省略global声明
    9. global name_list
    10. global password_list
    11. for num in range(3): # [0,3) 0,1,2
    12. name = input('请输入用户名:')
    13. password = input('请输入密码:')
    14. # 先判断用户名是否正确
    15. if name in name_list:
    16. # 在判断密码是否正确
    17. if password in password_list:
    18. print('登录成功')
    19. # 适应break关键,会结束循环,不再进行取值
    20. break
    21. else:
    22. print('密码不正确')
    23. else:
    24. print('用户名不正确')
    25. def register():
    26. global name_list
    27. global password_list
    28. name = input('请输入注册的用户名:')
    29. password = input('请输入出注册的密码:')
    30. # 将用户的名字和密码添加到全局的数据列表
    31. name_list.append(name)
    32. password_list.append(password)
    33. while 1==1:
    34. num = input('1-登录 2-注册 3-支付 4-下单 5-退出程序:')
    35. if num == '1':
    36. # 函数功能的调用
    37. login() # 函数名()
    38. elif num == '2':
    39. register()
    40. elif num == '3':
    41. pass
    42. elif num == '4':
    43. pass
    44. else:
    45. break

    1. data = 10
    2. def func(a):
    3. """
    4. 将字符串数据进行复制
    5. :param a:
    6. :return:
    7. """
    8. data_str = 'itcast'
    9. print(data_str * a)
    10. def func2(data):
    11. """
    12. 数据相加
    13. :param data:
    14. :return:
    15. """
    16. data = data+25
    17. print(data)
    18. func2(data)
    19. func(data)

    二:函数参数详解

    • 形参

      • def func(形参)

      • 函数定义时指定的参数

      • 本质形参可以理解为函数定义的内部变量,接收外部传递的数据

      • 缺省参数

        • 可以定义一个默认值,当形参没有传递数据时,可以使用默认值

      • 不定长参数

        • 接收任意个数的数据

        • *args 不能接受关键字传参的数据 接受位置参数的数据

        • **kwargs 接受关键字参数数据

    • 实参

      • func(实参)

      • 在函数调用时指定的参数数据

        • 位置参数

          • 在传递实参数据时,需要按照参数的位置进行数据的传递

          • 传递数据个数个形参个数一致

        • 关键字参数

          • 按照形参的名称传递数据

          • 形参=数据

    1. def func(形参):
    2. # 函数调用时传递的参数数据 实参
    3. func(实参)
    4. # 使用实参传递数据
    5. # 定义一个学生列表保存多个学生数据
    6. stu_list = []
    7. def add_student(name,age,gender,address):
    8. """
    9. 添加学生数据
    10. :param name: 姓名 str类型
    11. :param age: 年龄 int类型
    12. :param gender: 性别 str类型
    13. :param address: 地址 str类型
    14. :return:
    15. """
    16. # 往列表中添加学生数据
    17. stu_list.append({'name':name,'age':age,'gender':gender,'address':address})
    18. # 实参传递数据的方式1 位置参数
    19. # 按照参数的顺序和数量传递数据
    20. add_student('张三',20,'男','北京') # 位置传参
    21. print(stu_list)
    22. # 方式2 关键字参数
    23. # 使用参数的名称指定数据,和顺序无关
    24. add_student(address='上海',age=22,name='李四',gender='男') # 使用参数名传递数据
    25. print(stu_list)
    26. # 混合使用 保证位置参数在前面 关键字参数在后面
    27. # add_student(address='广州',20,'张三')
    28. add_student('王五',20,gender='男',address='广州')
    29. print(stu_list)
    1. # 使用实参传递数据
    2. # 定义一个学生列表保存多个学生数据
    3. stu_list = []
    4. def add_student(name,age,gender,address='北京'):
    5. """
    6. 添加学生数据
    7. :param name: 姓名 str类型
    8. :param age: 年龄 int类型
    9. :param gender: 性别 str类型
    10. :param address: 地址 str类型 默认值北京 缺省参数,当没有传递数据是,使用默认的数据
    11. :return:
    12. """
    13. # 往列表中添加学生数据
    14. stu_list.append({'name':name,'age':age,'gender':gender,'address':address})
    15. # 实参传递数据的方式1 位置参数
    16. # 按照参数的顺序和数量传递数据
    17. add_student('张三',20,'男','北京') # 位置传参
    18. print(stu_list)
    19. # 方式2 关键字参数
    20. # 使用参数的名称指定数据,和顺序无关
    21. add_student(address='上海',age=22,name='李四',gender='男') # 使用参数名传递数据
    22. print(stu_list)
    23. # 混合使用 保证位置参数在前面 关键字参数在后面
    24. # add_student(address='广州',20,'张三')
    25. add_student('王五',20,gender='男',address='广州')
    26. print(stu_list)
    27. add_student('赵六',20,gender='男')
    28. print(stu_list)
    1. # 使用形参接受数据
    2. # 定义一个学生列表保存多个学生数据
    3. stu_list = []
    4. # 不确定学生数据到底有哪些数据内容,传递的数据个数无法确定
    5. # 此时就可以使用不定长参数,接受任意个数的数据
    6. def add_student(*args,**kwargs):
    7. # *args接受位置参数传递的多个数据,会将数据保存在元组中
    8. # **kwargs接受关键字参数传递多个数据,将数据保存在字典中
    9. # 往列表中添加学生数据
    10. if len(args) !=0:
    11. stu_list.append(args)
    12. if len(kwargs) !=0:
    13. stu_list.append(kwargs)
    14. add_student('张三',20,'男')
    15. print(stu_list)
    16. add_student('李四',22,'男','北京')
    17. print(stu_list)
    18. add_student(name='张三',age=20)
    19. print(stu_list)
    20. add_student(name='张飞',age=20,address= '河北')
    21. print(stu_list)

    三:函数的数据传递

    将函数外部数据传递到函数内部使用

    1. # 将外部数据传递到函数内部
    2. # 方式1 定义全局变量
    3. data_str = 'itcast' # 不可变类型数据 数据本身不可修改
    4. data_list = ['hadoop','hive','spark','python'] # 可变类型 数据本身可修改
    5. def func():
    6. # 在函数内进行修改全局变量数据
    7. # 需要使用global 声明
    8. global data_str # 不可变类型
    9. data_str = data_str+'python'
    10. print(data_str)
    11. # global data_list 数据是可变类型,省略global声明
    12. data_list.append('flink')
    13. print(data_list)
    14. func()
    1. # # 将外部数据传递到函数内部
    2. # # 方式1 参数传递
    3. data_str = 'itcast' # 不可变类型数据 数据本身不可修改
    4. data_list = ['hadoop','hive','spark','python'] # 可变类型 数据本身可修改
    5. # 在函数定义时,定义参数接收数据
    6. def func(data):
    7. print(id(data))
    8. # 函数调用时传递参数数据 相当于是变量赋值
    9. func(data_str) # data = data_str # 当对data进行操作就是对data_str
    10. print(id(data_str))
    11. print('----------------------')
    12. func(data_list) # data = data_list # 当对data进行操作就是对data_list
    13. print(id(data_list))

    函数内部数据传到函数外部使用

    1. # 局部变量数据传递到外部
    2. def func():
    3. data = [1, 2, 3]
    4. data.append(4)
    5. print(data)
    6. # 需要将函数内的局部 变量传递外部使用
    7. # 借助返回值return 将内部的局部变量返回外部使用
    8. print(id(data))
    9. return data
    10. # 调用函数时,定义变量接收函数返回值
    11. data_res = func() # 返回值 等价 data_res = data
    12. print(data_res)
    13. print(id(data_res))
    14. # 可以将上一个函数的返回值传递到下一个函数
    15. def func2(data2):
    16. # data2 = data_res
    17. print(data2)
    18. print(id(data2))
    19. data2.append(5)
    20. # 将data_res 传递给func2
    21. func2(data_res)
    22. # data,data_res,data2代表的同一个数据
    23. print(data_res)

  • 相关阅读:
    CVE-2022-31137 Roxy-WI未经身份验证的远程代码执行漏洞复现
    .Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗
    Springframework之ResponseBodyAdvice——响应拦截处理
    【数据结构与算法】概论
    A-古代汉语知识点整理大全
    dubbo+nacos服务器部署调用失败
    算法-合并区间
    gin+gorm+mysql
    WIFI 万[néng]钥匙 v5.0.10/v4.9.80 SVIP版!
    一、8086
  • 原文地址:https://blog.csdn.net/m0_62008384/article/details/139277784