基本参数分为位置参数和关键字参数,位置参数必须在关键字参数之前,关键字参数也被称为默认参数,如果没有传递该参数则需要会将默认值传递给函数
return可以返回一个或者多个值,当返回多个值的时候,结果是由多个值组成的一个元组
# 用户输入信息,信息写入文件保存
def file(name, age, level, gender='男'):
  with open('../re_st/article/student_msg.txt', mode='a+',       encoding='utf-8') as f:
      msg = name + ' ' + age + ' ' + gender + ' ' + level
      f.write(msg)
      print()
  return '写入成功'
while True:
  context = input("请选择是否继续输入,如果停止请输入q或者Q,继续请按任意键:")
  if context.upper() == 'Q':
      break
  else:
      name = input('请输入姓名:')
      age = input('请输入年龄:')
      gender = input("请输入性别:")
      level = input('请输入学历:')
      if gender == '':
          print(file(name, age, level))
      else:
          print(file(name, age, gender,level)使用动态传参的原因:当一个函数有很多个形参或者只有一个形参,但是我们希望可以一个参数多写几个实参或者多个参数只写部分形参的时候,就需要用到动态传参,形参设定成任意参数
星号表示任意的,args,food作为形参,那么可以传递多个参数
任意参数必须放在位置参数的后边, 同时必须放在默认值参数, 默认值参数必须放在所有参数的最后边, 默认值参数传递的时候最好还是key=value形式传实参。
动态传递关键字参数:**kwargs
# 任意参数的传递
def eat(*food):
  return ('我姓吃',food)
print(eat('沙拉','苹果','玉米'))
# 任意关键字参数的传递
def eat(**kwargs):
  return kwargs
print(eat(good_food='家常菜', bad_food='外卖'))
# 任意关键字参数传递必须用key=value形式作用域:就是作用的范围,按照生效的范围分为全局作用域和局部作用域
全局作用域:包括内置命名空间和全局命名空间,在整个文件的任何位置都可以使用(遵循从上到下都原则执行)
局部作用域:只能在函数内部使用,本身就是局部命名空间
获取全局和局部命名空间中的函数和变量
num = 0
def cal(a,b,c):
  d = 10
  num = a + b + c
  print(globals())
  # 获取到全局和内置命名空间中的所有的函数和变量
  print(locals())
  # 获取到局部命名空间中的所有的函数和变量
  return num
print(cal(1,2,4))
# 这里需要注意的是globals()和locals()如果放在全局命名空间,获取的内容是一样的,因为是在全局,只有放在局部命名空间才能区分开。全局变量在全局都起作用,局部变量只在函数体内起作用。如果在函数内部声明引用全局变量,并且给全局变量进行新的赋值,那么全局变量已经发生变化,不再是最开始定义的值了。
a = 10
def func():
  global a
  # 声明函数内使用全局变量,如果没有global,那么下边的a是局部的
  a = a + 10
  # 给全局变量重新赋值
  print(a)
func()
print(a)
# 结果是:
20 20nonlocal和global的区别
原文:https://www.cnblogs.com/ddzc/p/12180260.html