python def函数总结(格式、参数类型、传参方式、全局变量/局部变量、参数类型提示(Type Hints))

简单无参函数

编写脚本test1.py

def register_user(): #函数名称只使用小写字母和下划线
  """docstring""" #描述函数的功能
  print("Welcome!")

register_user() #调用函数

执行脚本test1.py输出结果

Welcome!

有参函数

  • 对于有参函数,传递实参的方式有位置实参(顺序很重要!)和关键字实参(传递给函数的是名称-值对)。
  • 注:在定义函数时,必须将有默认值的形参放在所有参数最后,且默认值参数必须指向不可变对象。使用"函数名._defaults_"可查看函数默认值参数的当前值。

编写脚本test2.py

#变量name, time, gender,age和pets均为形参
#形参gender的默认值设置为female。给形参设置默认值时,等号两边不要有空格
#形参age对应的实参是可选的
def register_user(name, time, gender="female", age=""): 
  """docstring""" #描述函数的功能
  print("Welcome, " + name.title() + "! " + "You've been a member for " + time + " years.")
  print(name.title() + " is " + gender + "\n")
  if age:
    print(name.title() + " is " + age + " months old.")
  else:
    print("The age is not sure")

register_user("lele", "1","female") #使用位置实参调用函数
register_user(time="2",name="tantan",age="18") ##使用关键字实参调用函数

执行脚本test2.py输出结果

Welcome, Lele! You've been a member for 1 years.
Lele is female

The age is not sure
Welcome, Tantan! You've been a member for 2 years.
Tantan is female

Tantan is 18 months old.
  • 根据实参的类型,参数传递分为值传递和引用传递两种情况。当实参为不可变对象时,进行的是值传递,改变形参的值,实参的值不变;当实参为可变对象时,进行的是引用传递,改变形参的值,实参的值也一同改变。

编写脚本test3.py

def sum_obj(obj):
    print("函数初始值:", obj)
    obj += obj

#值传递
char1 = "abc"
print("char1初始值为:", char1) 
sum_obj(char1) #将不可变对象作为实参传递给形参
print("程序运行后char1的值为:", char1)

#引用传递
list1 = ["abc", "def"]
print("list1初始值为:", list1) 
sum_obj(list1) #将可变对象作为实参传递给形参 
print("程序运行后list1的值为:", list1)

执行脚本test3.py输出结果

char1初始值为: abc
函数初始值: abc
程序运行后char1的值为: abc
list1初始值为: ['abc', 'def']
函数初始值: ['abc', 'def']
程序运行后list1的值为: ['abc', 'def', 'abc', 'def']

函数return返回值

  •  函数可返回任何类型的值。return将值返回到调用函数的代码行,使程序的大部分繁重工作移到函数中去完成,从而简化主程序。 
  • 无论return语句出现在函数的哪个位置,只要被执行,就会直接结束函数的运行。
def register_user(name, time, gender="female", age=""): 
  """docstring""" #描述函数的功能
  user_info1 = "Welcome, " + name.title() + "! " + "You've been a member for " + time + " years.\n"
  user_info2 = name.title() + " is " + gender + "\n"
  if age:
    user_info3 = name.title() + " is " + age + " months old.\n"
  else:
    user_info3 = "The age is not sure\n"

  user_info = user_info1 + user_info2 + user_info3

  return user_info #一个函数只能有一个return

user1 = register_user("lele", "1","female") #使用位置实参调用函数
print(user1)
# Welcome, Lele! You've been a member for 1 years.
# Lele is female
# The age is not sure

user2 = register_user(time="2",name="tantan",age="18") ##使用关键字实参调用函数 
print(user2)
# Welcome, Tantan! You've been a member for 2 years.
# Tantan is female
# Tantan is 18 months old.
  • 函数返回字典 
def register_user(name, time, gender="female", age=""): 
  """docstring""" #描述函数的功能
  user_info = {"name":name.title(), "time":time, "gender":gender}
  if age:
    user_info["age"]=age

  return user_info

user1 = register_user("lele", "1","female") #使用位置实参调用函数
print(user1) 
# {'name': 'Lele', 'time': '1', 'gender': 'female'}
user2 = register_user(time="2",name="tantan",age="1") ##使用关键字实参调用函数 
print(user2) 
# {'name': 'Tantan', 'time': '2', 'gender': 'female', 'age': '1'}

传递不定长实参

  • 在形参列表中,必须将接受任意数量实参的形参放在最后。
  • python调用函数时,先匹配位置实参和关键字实参,其余实参将都传递给最后一个形参
  • *info传参时,接受没有指定参数名的参数;**info传参时,必须指定参数的参数名

编写脚本test6.py

def register_user(name, *info): #*parameter形式表示接收任意数量的实参并存储在一个元组中,带*的形参放在形参最后
  """docstring""" #描述函数的功能
  print("\nThe user information:")
  print(name)
  for n in info:
    print(n)

register_user("lele", "1","female") 
register_user("tantan","2", "male", "apple") 

info_list = ["1", "male", "orange"]
register_user("huahua", *info_list) #通过列表指定函数的可变参数

def user_profile(name,**info): #**两个星号创建空字典,传递来的名称-值对收集在这个字典中,可传递任意数量的实参
    profile = {}
    profile["name"] = name
    for key, value in info.items():
        profile[key] = value
    return profile

myinfo = user_profile("lele",age="1", gender="girl")
print(myinfo)

输出结果

The user information:
lele
1
female

The user information:
tantan
2
male
apple

The user information:
huahua
1
male
orange
{'name': 'lele', 'age': '1', 'gender': 'girl'}

全局变量和局部变量

  • 定义在函数内部的变量为局部变量,而在函数外的变量则为全局变量。
  • 局部变量仅能在定义的函数内部被访问,而全局变量可在整个程序中使用。
  • 当局部变量与全局变量重名时,对函数内部的变量赋值不会影响全局变量。
  • 通过关键字global修饰,可将局部变量变成全局变量
value = 1 #全局变量
def num_sum():
  a=1
  a += 5 #局部变量,只能被函数num_sum访问
  return a

print(value) #输出结果为1
print(num_sum()) #输出结果为6
print(a) #报错
def num_sum():
  global a #将a声明为全局变量
  a=1
  a += 5 
  return a

print(num_sum()) # 6
print(a) # 6

 

参数类型提示(Type Hints)

  • 具体可参考官网文档: https://docs.python.org/3/library/typing.html
  • 参数类型提示是从Python 3.5版本加入的。顾名思义,其功能在于提示需要输入的参数类型。执行程序时,参数类型提示并不会运行。
  • 参数类型提示的使用格式是在每个形参的后面跟冒号及参数类型
def num_sum(a: int):
  a += 5 #局部变量,只能被函数num_sum访问
  return a

print(num_sum(1)) # 6

 

posted @ 2023-01-14 23:42  yayagogogo  阅读(2204)  评论(0编辑  收藏  举报