当前位置:   article > 正文

python 第四章 函数 (pycharm) (2)_python 函数里使用的变量可以定义在函数外吗

python 函数里使用的变量可以定义在函数外吗

一 :变量作用域

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

变量的引用

  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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/676084
推荐阅读
相关标签
  

闽ICP备14008679号