Python3 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但也可以自己创建函数,这被叫做用户自定义函数。 

一 作用

  • 减少重复代码
  • 方便修改,更易扩展
  • 保持代码一致性

二 语法

def 函数名():   # def是define的缩写,定义的意思
  "注释:函数的功能"
  执行语句
  reture 返回值

函数名()       # 函数调用  

实例(Python3.0+):

使用函数来输出"Hello World!"

def hello():
    print('hello')

hello()

# 运行结果
# hello

三 命名规则

  • 函数明必须以下划线或字母开头,可以包含任意字母、数字,下划线自由组合
  • 函数区分大小写
  • 函数明不能使用保留字

四 参数

  • 形参:定义函数时使用的参数是形参
  • 实参:调用函数时,传入的参数是实参

五 参数分类

  1. 位置参数 --> 必须位置一一对应,多一个不行,少一个也不行
  2. 关键字参数
  3. 默认参数
  4. 不定长参数(• 不定长无命名参数 *args --> 元组   • 不定长有命名参数 **kwargs --> 字典)   

位置参数

  • 形参和实参必须一一对应,多一个不行,少一个也不行

实例(Python3.0+):

def count(name,age,sex):
    print(name)
    print(age)
    print(sex)

count("xiaow",30,"man")
#运行结果:
#xiaow
#30
#man

# 参数对应错误实例
def count(name,age,sex):
    print(name)
    print(age)
    print(sex)

count('xiaow',30,'man','student')
# 运行结果
# TypeError: count() takes 3 positional arguments but 4 were given

关键字参数

  • 关键字参数,无须一一对应,缺一不行多一也不行  

实例(Python3.0+):

# 参数一一对应
def foo(name,age):
    print('my name is %s age is %s' %(name,age))

foo(name='xiaow',age=19)
# 运行结果:
# my name is xiaow age is 19

# 参数不对应
def foo(name,age):
    print('my name is %s age is %s' %(name,age))

foo(age=19,name='xiaow')
# 运行结果:
# my name is xiaow age is 19

# 参数缺失
def foo(name,age):
    print('my name is %s age is %s' %(name,age))

foo(name='xiaow')
# 运行结果:
# TypeError: foo() missing 1 required positional argument: 'age'

小提示:位置参数必须在关键字参数左边

实例(Python3.0+):

# 位置参数在关键字参数左边
def foo(name,age,gender):
    print('my name is %s age is % gender is %s' %(name,age,gender))

foo('xiaow',age=19,gender='girl')
# 运行结果:
# my name is xiaow age is  19ender is girl

# 位置参数在关键字参数右边
def foo(name,age,gender):
    print('my name is %s age is % gender is %s' %(name,age,gender))

foo(name='xiaow',19,girl)
# 运行结果:
# SyntaxError: positional argument follows keyword argument(关键字参数必须跟随在位置参数后边)

默认参数

  •  调用函数时,如果没有传递参数,则会使用默认参数。

实例(Python3.0+):

# 传递默认参数
def foo(name,age=19):
    print('my name is %s age is %s' %(name,age))

foo('xiaow',20)
# 运行结果:
# my name is xiaow age is 20

# 不传递默认参数
def foo(name,age=19):
    print('my name is %s age is %s' %(name,age))

foo('xiaow')
# 运行结果:
# my name is xiaow age is 19  

不定长参数

  • 不定长无命名参数 *args(加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
  • 不定长有命名参数 **kwargs(加了两个星号 ** 的参数会以字典的形式导入

*args

实例(Python3.0+):

# 传递多个参数
def foo(*args):
    print(args)
    for i in args:
        print(i)

foo('xiaow',20,'girl')
# 运行结果
# ('xiaow', 20, 'girl')
# xiaow
# 20
# girl

# 传递元组
def foo(x,y,*args):
    print('x is %s' %x)
    print('y is %s' %y)
    print('args is %s' %args)

foo('study','python',('xiaow',20,'girl'))
# 运行结果:
# x is study
# y is python
# args is ('xiaow', 20, 'girl')

# 传参时加*与不加*的区别
# 不加*
def foo(*args):
    print(args)
    for i in args:
        print(i)

foo(1,2,('a','b'))
# 运行结果:
# (1, 2, ('a', 'b'))
# 1
# 2
# ('a', 'b')

# 加*
def foo(*args):
    print(args)
    for i in args:
        print(i)

foo(1,2,*('a','b'))
# 运行结果:
# (1, 2, 'a', 'b')
# 1
# 2
# a
# b

**kwargs

实例(Python3.0+):

# 传递多个参数
def foo(**kwargs):
    print(kwargs)
    for i in kwargs:
        print(i)

foo(name='xiaow',age=20)
# 运行结果:
# {'name': 'xiaow', 'age': 20}
# name
# age

# 传递字典
def foo(x,y,**kwargs):
    print('x is %s' %x)
    print('y is %s' %y)
    print('kwargs is %s' %kwargs)

dict1={'name':'xiaow','age':20}
foo('study','python',**dict1)  # 传递字典时,不加**会报错
# 运行结果:
# x is study
# y is python
# kwargs is {'name': 'xiaow', 'age': 20}  

六 参数总结

  • 位置参数、关键字参数、默认参数混用时,三者的顺序是:位置参数,关键字参数,默认参数(且默认参数不能传值)
  • args、位置参数、默认参数混用时,三者的顺序是:位置参数、默认参数、*args位置参数、*args、默认参数
  • 位置参数、默认参数、**kwargs混用时,三者的顺序必须是:位置参数、默认参数、**kwargs
  • 位置参数、*args、**kwargs混用时,三者的顺序必须是:位置参数、*args、**kwargs

 

posted @ 2018-08-01 16:01  迷鸟归林  阅读(321)  评论(0编辑  收藏  举报