Python入门教程[3]-函数

王 茂南 2018年2月17日06:24:20
评论
2165字阅读7分13秒
摘要为了简化代码,我们会用到函数的概念,那么这一篇教程我们就来看一下在python中是如何实现函数的编写的。

函数

我们经常在同一个程序中多次复用相同的代码, 函数可以很好的帮助我们完成这一点. 这一篇我们就会来介绍函数的定义. 

在具体说明之前, 放一些其他教程的链接:

函数的定义

使用关键字def来定义一个函数

我们来看一个简单的函数的例子

  1. #下面这个函数接受一个字符串和一个字母作为参数,返回这个字符串中有这个字母的个数
  2. def char_count(str,char):
  3.     return str.count(char)
  4. # 函数的调用
  5. char_count('hello world','o')
  6. >> 2

参数的传递

函数中参数顺序是定义时指定的,如果不按照顺序传入参数,必须使用参数名进行传参

def animal_feature(animal,feature):
    print(animal,'can',feature)

animal_feature('eagle','fly')#按顺序输入参数
>> eagle can fly
animal_feature(feature='fly',animal='eagle') #不按顺序输入参数
>> eagle can fly

默认参数值

函数的参数可以有默认的默认值,也就是说如果我们没有给指定参数变量任何值则会赋其默认值

  1. def animal_feature(animal,feature='fly'):
  2.     print(animal,'can',feature)
  3. animal_feature('eagle')
  4. >> eagle can fly

注意

  • 默认参数后面不能再有普通参数,比如f(a,b=10,c)就是错误的,应该写成f(a,c,b=90)

 

参数的类型

在python中, 我们也是可以定义函数中参数的数据类型, 和返回值的类型的, 我们只需要将数据类型使用冒号加在变量名的后面即可, 类似下面的代码:

  1. def sum(a: int, b: int) -> int:
  2.     return a+b
  3. if __name__ == "__main__":
  4.     print(sum(1,2))

 

可变长的参数

可变参数的使用方法就是在参数列表前加*

比如我们要传入一些数字,返回这些数字的和, 可以看下面的例子:

  1. def num_total(*list1):
  2.     num = 0
  3.     for i in list1:
  4.         num = num+i
  5.     return num
  6. num_total(1,2,3,4,5)
  7. >> 15
  8. num_total(1) #这里输入的参数个数是可变的
  9. >> 1

除了前面的这种方式,我们还可以通过在前面增加两个*的方式来保存为字典参数,这时调用函数的方法则需要采用 arg1=value1,arg2=value2 这样的形式,我们可以看一下下面的例子:

  1. def PrintNum(*args,**kwargs):
  2.     print('args:{}'.format(args))
  3.     print('kwargs:{}'.format(kwargs))
  4. PrintNum(*[1,2,3],x=1,y=2)
  5. >> args:(1, 2, 3)
  6. >> kwargs:{'x': 1, 'y': 2}
Python入门教程[3]-函数

更多的例子(关于传入实参的时候,加上*号,可以将列表中的元素拆成一个个的元素

Python入门教程[3]-函数

关于更多内容,参考这个链接:Python 优雅的使用参数 - 可变参数(*args & **kwargs)

函数中修改参数值

首先我们说明一下函数传值函数传引用

函数传值

函数参数传值的意思是函数调用过程中,在函数内部使用到的参数只是一个局部变量,在函数执行结束后就销毁了。不影响调用该函数的外部参数变量的值。

函数传引用

函数参数传引用的意思是传递给函数的参数就是外部使用的参数,函数执行过程中对该参数进行的任何修改都会保留,当函数调用结束后,这个参数被其他代码使用中都是函数修改过后的数据。

在python中,参数是没有类型的,可以传递任何类型的对象作为参数,但是不同类型的参数在函数中的修改,表现也是不一样的。

  • 不可变对象 : 数值、字符串、元组等
  • 可变对象 : 列表、字典等
num = 1
list1 = [1]

def change_data(num,list1):
    num*2
    list1.extend([2,3])

num #num的值没有改变,因为num是不可变类型
>> 1

list1 #list1的值发生改变,因为list1是列表,是可变对象
>> [1,2,3] 

变量的作用域

关于变量的作用域不准备讲了,与c语言里类似,差不多就是除非是全局变量(global),否则函数里变量改变不影响函数外面变量的值

可以看一下下面这个例子,与上面函数修改参数值进行类比

num = 1
list1 = [1]

def change_data(num,list1):
    num = 2 #这里num是函数内部的局部变量
    list1 = [1,2,3]#这里list1是函数内部的局部变量,所以list1改变不改变外部变量的值

num 
>> 1

list1
>> [1]

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2018年2月17日06:24:20
  • 转载请务必保留本文链接:https://mathpretty.com/8950.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: