菜鸟教程python函数,python函数详解

  菜鸟教程python函数,python函数详解

  定义函数

  我们通过斐波那契数列来理解定义函数。

  DEF FIB (N) 3360 #打印斐波那契数列到N

  .将斐波那契数列打印到N

  .a,b=0,1

  .whilean:

  .print(a,end= )

  .a,b=b,a b

  .打印()

  .

  #调用上面定义的函数

  .国际纤维协会(2000年)

  012358132134589144233776109871597关键字 def 引入了一个函数定义 。后面必须跟函数名和一系列用括号括起来的参数。组成函数体的语句从下一行开始,必须缩进。

  函数的第一条语句可以是字符串常量,它是该函数的文档字符串,也可以是docstring。有许多工具可以用来自动生成在线或可打印的文档,或者允许用户在代码中交互式地浏览文档;用代码编写文档字符串是一个很好的做法,所以请养成编写文档字符串的习惯。

  函数的执行引入了一个新的符号表用于存储函数的局部变量.更准确地说,函数中的所有变量赋值都将存储在这个局部符号表中;所以在寻找对变量的引用时,我们会先寻找局部符号表,然后是闭包函数的局部符号表,然后是全局符号表,最后是内置名称表。因此,尽管全局变量可能在函数中被引用,但它们不能在函数中直接赋值(除非变量是由全局语句定义的)。

  当调用一个函数时,将函数参数引入局部符号表;因此,参数通过值传递(该值表示对对象的引用,而不是其值)。[1]当在一个函数中调用另一个函数时,将为此调用创建一个新的局部符号表。

  函数定义将在当前符号表中引入函数的名称。对应于该函数名称的值类型将被解释器解释为用户定义的函数。该值可以指定给另一个名称,该名称可以用作函数。这是一种常用的重命名机制:

  小谎

  functionfibat10042ed0

  f=纤维

  女(100)

  01123581321345589默认参数值

  最常见的形式是为一个或多个参数指定默认值。通过这种方式,可以用比定义更少的参数来调用函数。例如:

  defask_ok(提示,重试次数=4,提醒次数=Pleasetryagain!):

  whileTrue:

  ok=输入(提示)

  伊弗金( y ,叶, y

  es'):

  returnTrue

  ifokin('n','no','nop','nope'):

  returnFalse

  retries=retries-1

  ifretries<0:

  raiseValueError('invaliduserresponse')

  print(reminder)该函数可以有几种不同的调用方式:

  只指定强制的参数

  参数: ask_ok('Do you really want to quit?')

  提供一个可选参数

  参数: ask_ok('OK to overwrite the file?', 2)

  或者给定全部的参数

  参数: ask_ok('OK to overwrite the file?', 2, 'Come on, onlyyes or no!')

  上述例子顺便也提及了 in 关键字。它是用来测试某个特定值是否在一个序列中。

  默认值是在定义函数时的 “定义过程中” (defining )的范围内评估的(函数参数默认值是个变量的话,要根据函数定义前变量的值来确定参数默认值), 所以,

  

i=5

  deff(arg=i):

  print(arg)

  i=6

  f()

会打印5.

  关键字参数

  形如 kwarg=value 形式的参数是 关键字参数。例如,以下函数:

  

defparrot(voltage,state='astiff',action='voom',type='NorwegianBlue'):

  print("--Thisparrotwouldn't",action,end='')

  print("ifyouput",voltage,"voltsthroughit.")

  print("--Lovelyplumage,the",type)

  print("--It's",state,"!")

接收一个必选参数 (voltage) 和三个可选参数(state,action, 和type)。这个函数下方式调用:

  

parrot(1000)#一个位置参数

  parrot(voltage=1000)#一个关键字参数

  parrot(voltage=1000000,action='VOOOOOM')#2个关键字参数

  parrot(action='VOOOOOM',voltage=1000000)#2个关键字参数

  parrot('amillion','bereftoflife','jump')#3个位置参数

  parrot('athousand',state='pushingupthedaisies')#一个位置参数,一个关键字参数

但是下列的所有调用方式都是无效的:

  

parrot()#必选参数缺失

  parrot(voltage=5.0,'dead')#非关键字参数在关键字参数后面

  parrot(110,voltage=220)#同一参数重复赋值

  parrot(actor='JohnCleese')#未知关键字参数

在函数调用中,关键字参数必须遵循参数位置。传递的所有关键字参数必须跟函数接受的其中一个参数相匹配。(例如:actor在函数parrot中不是一个有效的参数),并且它们的顺序并不重要。这同样也包括那些非必选参数 (例如parrot(voltage=1000)同样有效)。没有参数可能多次获取一个值。下例就是因此而失败的:

  

>>>deffunction(a):

  ...pass

  ...

  >>>function(0,a=0)

  Traceback(mostrecentcalllast):

  File"<stdin>",line1,in<module>

  TypeError:function()gotmultiplevaluesforkeywordargument'a'

当最后存在**name形式的参数时,它最后会接收一个字典,(参见Mapping Types --- dict) 包含所有除了和形式参数相对应的关键字参数。这可以与* name形式的形式参数(在下一小节中描述)结合,该参数接收包含正式参数列表之外的位置参数的元组。 (*name必须出现在**name之前。) 例如,我们如果定义一个如下函数:

  

defcheeseshop(kind,*arguments,**keywords):

  print("--Doyouhaveany",kind,"?")

  print("--I'msorry,we'realloutof",kind)

  forarginarguments:

  print(arg)

  print("-"*40)

  forkwinkeywords:

  print(kw,":",keywords[kw])

它可以像这样调用:

  

cheeseshop("Limburger","It'sveryrunny,sir.",

  "It'sreallyvery,VERYrunny,sir.",

  shopkeeper="MichaelPalin",

  client="JohnCleese",

  sketch="CheeseShopSketch")

可变参数

  最后,最不常用的指定参数的选项是可变数量的参数。这些参数将被组装成一个元组 (参见 元组和序列) 。在可变参数之前,可能会出现零个或多个正常参数。

  

defwrite_multiple_items(file,separator,*args):

  file.write(separator.join(args))

分离参数列表

  当输入的参数已经是列表或元组形式而为了调用其中单独的位置参数时,将会出现与上面相反的情况。例如内置函数 range() 需要有独立的 start 和 stop 参数。如果输入的时候不是独立的参数,则需要用 * 操作符来将参数从列表或者元组里面提取出来:

  

>>>list(range(3,6))#正常利用参数调用函数

  [3,4,5]

  >>>args=[3,6]

  >>>list(range(*args))#从列表中提取参数来调用函数

  [3,4,5]

Lambda 表达式

  我们可以使用 lambda关键字来创建小型匿名函数。此函数会返回其两个参数的和:lambda a,b:a + b。可以在任何需要函数对象的场合使用 Lambda 函数。它们在语法上仅限于单个表达式。从语义上讲,它们只是普通函数定义的语法糖。与嵌套函数定义类似,lambda 函数可以从包含它的上下文中引用变量:

  

>>>defmake_incrementor(n):

  ...returnlambdax:x+n

  ...

  >>>f=make_incrementor(42)

  >>>f(0)

  42

  >>>f(1)

  4

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: