Python自定义函数基础

1 格式:
    def functionName(参数列表):
                  方法体
例子1:
>>>def greet_user():
        print(“hello”)
>>>greet_user()
hello


例子2:
>>>def greet_user(username): #username形参
      print(“hello,”+ username+“!”)
>>>greet_user(“zhangsan”)#zhangsan 实参
hello, zhangsan!

鉴于函数定义中可能包含多个形参,因此在函数调用中也可能包含多个实参。向函数中传递实参的方式很多,可以使用位置实参,这要求实参的顺序和形参的顺序相同;也可以使用关键字形参,其中的每个实参都有变量名和值组成;还可以使用列表和字典。
                                                     
(1)位置实参
        要求实参的顺序和形参的顺序相同
        例子:
       
def describe_pet(animal_type,pet_name):
                  print(“\n I have a”+animal_type+”.”)
                  print(“My ”+animal_type+”’sname is ”+pet_name+”.”)
 describe_pet(‘hamster’,’harry’)

当两个参数的位置交换后,表达的意思就会出现错误。
这种传参方式应该是最好理解的,大部分语言都是这种传参方式。
(2)默认参数
编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,Python将使用指定实参,否则使用默认值。
123 def describe_pet(pet_name,animal_type=‘dog’):
    print(“\n I have a”+animal_type+”.”)
    print(“My ”+animal_type+”’sname is ”+pet_name+”.”)

注意:在使用默认参数时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。
当然,默认值不一定是字符串,数字等,同时也支持各种序列。
def f(a, L=[]):
    L.append(a)
    return L
 
print(f(1))
print(f(2))
print(f(3))

输出结果为
[1]
[1, 2]
[1, 2, 3]
 
如果你不想调用之间共享的默认设置,你可以这样写
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

感觉有点像Java中单例模式中的懒汉式,虽然不能这么比。
 
(3)关键字实参
        关键字实参是传递给函数的 名称-值对。你直接在实参中将名称和值关联起来,因此向函数传递实参时不会混淆
def parrot(voltage, state='a stiff', action='voom',type='Norwegian Blue'):
    print("--This parrot wouldn't", action, end=' ')
    print("ifyou put", voltage, "volts through it.")
    print("--Lovely plumage, the", type)
    print("--It's", state, "!")
 
parrot(1000)                                          # 1positional argument
parrot(voltage=1000)                                  # 1 keywordargument
parrot(voltage=1000000,action='VOOOOOM')            # 2 keywordarguments
parrot(action='VOOOOOM',voltage=1000000)            # 2 keywordarguments
parrot('amillion', 'bereft of life', 'jump')        # 3 positional arguments
parrot('athousand', state='pushing up the daisies') # 1 positional, 1 keyword

执行后的结果
>>>
===========RESTART: D:/python/pythonLearning/KeywordArguments.py ===========
-- This parrotwouldn't voom if you put 1000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't voom if you put 1000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't VOOOOOM if you put 1000000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't VOOOOOM if you put 1000000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't jump if you put a million volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's bereftof life !
-- This parrotwouldn't voom if you put a thousand volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's pushingup the daisies !
 
但是下面的调用方式会报错:
parrot()                    # 必须的参数没有填入
parrot(voltage=5.0, 'dead')  # 关键字传参后面的一定也是关键字传参
parrot(110, voltage=220)    # 同一个参数传了不同的实参
parrot(actor='John Cleese')  # 函数定义中没有这个形参。
关键字实参后面不能再有位置实参。
当必填参数没有时,会报错。
当必填参数以位置实参的方式传递时,默认参数可以按照关键字实参的方式传递,也可以以位置实参的方式传递,而且此时,必填参数一定在默认参数前面。
当必填参数以关键字实参方式传递的时候,默认参数传递的时候也一定是以关键字实参方式传递,而且此时与位置无关。
关键字实参的关键字必须是形参中有的,否则会报错。
(4)任意多数目的参数“*”
最不常使用的选项是指定可以使用任意数量的参数调用的函数。这些参数将被裹在一个元组中。在可变数目的参数之前, 零个或更多的正常参数可能会发生。
def write_multiple_items(file, separator, *args):
  file.write(separator.join(args))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/97cd76b6a6d405fb7aea88d01d78d3de.html