Python函数

Posted 荒唐了年少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python函数相关的知识,希望对你有一定的参考价值。

大多数高级语言都提供了函数这个概念,Python也不例外,有过其他语言学习经验
的都或多或少了解什么是函数,使用函数有哪些好处。下面首先简要叙述我们为什
么需要函数,以及使用函数有哪些好处?
函数之所以被创建出来,我想最根本的原因是程序员的"惰性"。与平常生活一样,
我们总是需要重复去做一件有意见的事情。而在我们的程序中,我们也需要在许多
不同的地方实现同一个功能,如果每次都需要将之前的代码重新再写一遍,这不仅
增加了我们的工作量,同时也使代码变得臃肿。而如果我们将这些功能做成一个个
独立工具,在需要时之间调用,这不仅减轻了工作量,而且使代码更加简洁,更加
的易于维护。而我们一般将这些独立工具称作函数。
函数可以看做是一种代码抽象的方式,借助抽象,我们可以不关心函数的具体实现
过程,而直接在更高层面上思考问题。

了解了函数的基本概念后,我们来具体了解一下Python的函数:
在Python中,可以将函数分为Python内置的函数的与用户自定义的函数。下文主要
叙述用户如何定义一个函数,以及在定义一个函数时需要注意什么。而对于众多的
Python内置函数,如果读者希望了解它们的用途,可以使用函数help(函数名)
查询某个函数的作用。
 
如何定义一个函数?
定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然
后,在缩进中编写函数体,函数的返回值用return语句返回。
def FunctionName(参数):
    ...
    函数体
    ...
    
    return #

 

下面给出一个函数示例,用于计算 n!:

[[email protected] pythoncode]$ python3 expf.py 
temp =  6
[[email protected] pythoncode]$ cat expf.py 
def countN(n):
    result = 1

    for i in range(1, n+1):
        result *= i

    return result

temp = countN(3)
print(temp = , temp)

 

从上述的如何定义一个函数中,我们可以看到,函数名与参数的选取、函数体的构
建都与该函数需要实现的具体功能相关,没有统一标准。但Python对函数参数的设
置却有着很大的灵活性。除了正常定义的必选参数外,还可以使用默认参数、可变
参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简
化调用者的代码。下面我们就来具体看一下这些不同的参数。
 
位置参数:就是我们正常定义函数时的必选参数,也是我们平时一般意义上的函数
参数。上述例子中的函数 countN(n) 中的 n 就是位置参数。当我们定义的某个函
数有多个位置参数,在调用该函数时,传入的值按定义时的顺序从左到右赋给各个
位置参数。
 
默认参数:在我们定义某个函数时,预先给某个函数参数一个初值,这个参数就叫
做默认参数,当用户调用此函数时,如果没有给此函数的默认参数一个传入值,函
数运行时,默认参数就会使用定义时给定的初始值,如果调用时用户给定了默认参
数传入值,函数运行时就使用用户的给定值。
[[email protected] pythoncode]$ python3 myPrint.py 
Happy!
Hello, World!
[[email protected] pythoncode]$ cat myPrint.py 
def myPrint(str = Hello, World!):
    print(str)
    return

myPrint(Happy!)
myPrint()

 

在使用默认参数时需要注意:
1.必选参数在前,默认参数在后,否则Python的解释器会报错。因为如果默认参数
在前,当用户调用此函数时,仅给定了必选参数,函数在将用户给定值传给函数参
数时,无法判定用户是希望使用默认参数的默认值还是调用式错误,丢失了数值。
 
2.在设置默认参数时,如果函数有多个参数,把变化大的参数放前面,变化小的参
数放后面。变化小的参数就可以作为默认参数。
 
3.当调用者希望使用默认参数中的某几个默认参数时,调用时不按顺序提供部分默
认参数,需要把参数名写上。
[[email protected] pythoncode]$ python3 somevalue.py 
Hurry in LemonTree ,he is 18 years old and graduated from GreedApple
[[email protected] pythoncode]$ cat somevalue.py 
def myPrint(name, school = GreedApple, age = 18, hometown = Pecato):
    print(name, in, hometown, ,he is, age, years old and graduated from, school)
    return

myPrint(Hurry, hometown = LemonTree)

 

4.定义默认参数时,默认参数必须指向不变对象,否则在多次调用函数时可能产生
错误的结果。因为,Python函数在定义的时候,默认参数的值就被计算出来了,在
每次调用该函数时,如果改变了默认参数的内容,则下次调用时,默认参数的内容
就变了,不再是函数定义时的值了。

 

可变参数:调用函数时,可变参数的传入值数量是可变的,类似于传入一个list或
tuple。只是,定义可变参数和定义一个list或tuple参数相比,仅仅在参数名前面
加了一个*号。并且Python允许你在list或tuple前面加一个*号,把list或tuple的
元素变成可变参数用来作为调用函数时的传入值。

[[email protected] pythoncode]$ python3 sum.py 
10
10
10
10
[[email protected] pythoncode]$ cat sum.py 
def sum_one(value):
    sum = 0

    for i in value:
        sum += i

    return sum

def sum_two(*value):
    sum = 0

    for i in value:
        sum += i

    return sum

value = [1, 2, 3, 4]
print(sum_one([1, 2, 3, 4]))
print(sum_one(value))
print(sum_two(1, 2, 3, 4))
print(sum_two(*value))

 

关键字参数:与可变参数相比,关键字参数允许你传入0个或任意个含参数名的参
数,这些关键字参数在函数内部自动组装为一个dict。 只是,定义关键字参数和
定义一个dict参数相比,仅仅在参数名前面加了两个*号。在调用函数时,Python
允许dict前加两个*号,将其转换为关键字参数传进去

[[email protected] pythoncode]$ python3 myPrint2.py 
Name:  Hurry age: 18 {Number: 12345, SchoolID: 54321}
Name:  Hurry age: 18 {Number: 12345, SchoolID: 54321}
[[email protected] pythoncode]$ cat myPrint2.py 
def myPrint(name, age, **other):
    print(Name: , name, age:, age, other)

    return 

temp = {Number: 12345, SchoolID: 54321}
myPrint(Hurry, 18, **temp)
myPrint(Hurry, 18, Number = 12345, SchoolID = 54321)

 

命名关键字参数:可以限制传入值KEY的关键字参数,定义时和关键字参数**kw不
同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。

[[email protected] pythoncode]$ python3 myPrint3.py 
Name:  Hurry age: 18 Number 12345 SchoolID 54321
Traceback (most recent call last):
  File "myPrint3.py", line 8, in <module>
    myPrint(Hurry, 18, Number = 12345, CardID = 54321)    
TypeError: myPrint() got an unexpected keyword argument CardID
[[email protected] pythoncode]$ cat myPrint3.py 
def myPrint(name, age, *, Number, SchoolID):
    print(Name: , name, age:, age, Number, Number, SchoolID, SchoolID)

    return 

temp = {Number: 12345, SchoolID: 54321}
myPrint(Hurry, 18, **temp)
myPrint(Hurry, 18, Number = 12345, CardID = 54321)

 

注意:如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再
需要一个特殊分隔符*了
例如:def myPrint(name, age, args*, Number, SchoolID):
 
Tips:
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名
关键字参数,这5种参数都可以组合使用。但是请注意:函数定义时参数定义的顺
序必须按照:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
 
如果我们想定义一个什么都不做的空函数,我们可以使用 pass语言 作为函数体。
实际上pass可以用来作为占位符,假如现在还没想好怎么写函数的代码,则可以先
放一个pass,让代码能运行起来。











































以上是关于Python函数的主要内容,如果未能解决你的问题,请参考以下文章

python使用上下文对代码片段进行计时,非装饰器

python 元组有用的函数,方法和片段。

Python代码阅读(第26篇):将列表映射成字典

VSCode自定义代码片段——声明函数

Python学习 :函数

VSCode自定义代码片段8——声明函数