漫漫程序媛进化鹿

python学习笔记之函数

2018-08-06  本文已影响25人  keeeeeenon

定义函数


def f_abs(x):
 if not isinstance(x,(int,float)):

          raise TypeError("bad operand type")

      if x<0:

          return -x

      elif x>0:

          return x

      else:

          return x

空函数

使用pass,创建空函数,待以后补上。但是不写pass空着会报错。


def f_pass(): 

 pass

参数检查


if not isinstance(x,(int,float)):

      raise TypeError("bad operand type")

返回多个值


return nx, ny

函数参数 廖雪峰官方网站-函数的参数

** 参数类型:位置参数,默认参数,可变参数,关键字参数,命名的关键字**

位置参数

就是我们使用的最普通的参数,所有位置参数都要传参。

在传递参数时,我们可以写成赋值的形式:x=9,但是这种传参只能排在右边,并且要确保所有的参数都穿进去(赋值传参,很容易丢失参数,如测试)


>>> def test(x,y,z):

... print(x)

... print(y)

... print(z)

...

 >>> testn(9,y=0,z=0)

9

0

0

>>> test(z=3,y=2,x=1) #使用指定参数时,传参位置可以改变,但不能丢失,多次赋值

1

2

3

------------以下是错误用例-----------------------

>>> test(1,y=2,3)        #指定参数应该位于右侧,如同指定默认参数的方式 File "<stdin>", line 1

SyntaxError: positional argument follows keyword argument

>>> test(1,x=2,z=3) #再次指定x,同时也丢失了一个位置参数

Traceback (most recent call last):

  File "<stdin>", line 1, in<module>

TypeError: test() got multiple values for argument 'x'

默认参数

python的默认参数比c++的更灵活:

1、默认参数都需要放在最后边(必选参数必须在前,默认在后)

2、可以仅修改需要的默认参数,而不必把该参数之前的默认参数都填上。

(让一切看起来合理)


def enroll(name,gender,age=60,city="zibo"): 

    print(name)

    print(gender)

    print(age)

    print(city)

-------------------------------

output:

>>> from test import enroll

>>> enroll("chang","F")

chang

F

60

zibo

>>> enroll("chang","F",city="linzi")  #并没有填写city之前的默认参数age

chang

F

60

linzi

注意,默认参数指向对象生效的时间是定义时

正是由于默认参数生效是在定义时(可以理解成第一次调用吧!X–这是错误的理解,默认参数指向的默认对象,应该伴随函数生命的从定义开始),而不是每次调用时。

定义函数后,L即指向对象[],这个对象应该是伴随该函数的,随意在多次调用默认函数后,会发现追加多次END。


def add_end(L=[]):

L.append('END')

return L

>>> add_end()

['END', 'END']

>>> add_end()

['END', 'END', 'END']#解决办法,默认指向None,常量。

def add_end(L=None):

if L is None:

    L = []

L.append('END')

return L

可变参数

函数参数列表,看起来很简洁,但是可以传入多个参数。

对于函数来说,收到的就是个tuple。

形式:*args


def calc(*numbers):

sum = 0

for n in numbers:

    sum = sum + n * n

return sum

>>> calc(1, 2)

5

>>> calc()

0

>>> nums = [1, 2, 3] #也可以这样传进去

>>> calc(*nums)

14

关键字参数

该类型参数是指可以传入任意个带参数名的参数,即可以传入制定参数。

这时传入的是dict,需要内部确定关键字参数的名字。

形式:**kw


def person(name, age, **kw):

print('name:', name, 'age:', age, 'other:', kw)

>> person('Adam', 45, gender='M', job='Engineer')

name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}

>>> person('Jack', 24, **extra) #也可这样传入

name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

···

命名关键字参数 

限制关键字参数的名字,传入时,必须指定参数。 

形式:*(如果前边有可变参数(*args)则无需*)

···

def person(name, age, *, city, job):

 print(name, age, city, job)

>>> person('Jack', 24, city='Beijing', job='Engineer')

Jack 24 Beijing Engineer#如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person(name, age, *args, city, job):    

print(name, age, args, city, job)#命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:

>>> person('Jack', 24, 'Beijing', 'Engineer')

Traceback (most recent call last):

  File "<stdin>", line 1, in<module>

TypeError: person() takes 2 positional arguments but 4 were given

参数组合使用

对于任意函数,都可以通过类似func(*args, **kw)的形式调用它


嗨呀
上一篇下一篇

猜你喜欢

热点阅读