`
t289571130c
  • 浏览: 15207 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

函数语句Python Tutorial(四):更多的控制流工具 函数语句

阅读更多

题记:写这篇博客要主是加深自己对函数语句的认识和总结现实算法时的一些验经和训教,如果有错误请指出,万分感谢。

    

4.1 if语句

    或许大家最悉熟的语句类型就是if语句。例如:

    

    可以有零到多个elif分部,else分部是可选的。关键字elif是对else if的简写,在防止多过的缩进方面是效有的。一个if...elif...elif...序列是对其它言语里的switch或case语句的一种换替。

    

4.2 for语句

    Python面里的for语句和C或Pascal面里的有点不同。它不是总在数字的算数序列长停止代迭(像Pascal),或应用户有能力定义代迭步调和止停条件(像C),Python的for语句可以在任何序列(表列或字符串)上代迭,按照它们出现在序列中的次序。例如:

    

    在循环面里修改正在被代迭的序列(只是能可可修改的序列类型,像表列)不是全安的。如果你想修改正在代迭的序列(例如,重复前当的选中项),你必须在一个拷贝上代迭。片切作操可以别特便利的得获序列的拷贝:

    

    

4.3 range()函数

    如果你需要在一个数字序列上代迭,内建函数range()就在手边,它生产算数序列:

    

    给出的结点束绝不会包括在序列里,range(10)生产10个值,这些值是长度为10的序列的全体项的正当引索值。可以让range从另一个数字开始,或指定一个不同的增量(可是以负值,有时候这个增量被称为步长):

    

    想要在一个序列的引索长停止代迭,可以结合range()和len()来应用:

    

    在大多数这样的情况,应用enumerate()函数非常便利。

    当你仅仅是打印一个range,会生发一个奇异的情事:

    

    在多许方面,range()返回的对象的行为就像一个表列,事实上它不是。它是一个对象,当你在它下面代迭时,它会返回期望序列的连续的项,它不并真的生产一个表列,这样可以节俭空间。

    我们称这样的一个对象是可代迭的,合适作为函数和结构的目标,从这些函数和结构希望得获连续的项直到这些项全体耗尽。我们经已看到for语句就是这样一个代迭器,list()函数是另一个,它从可代迭的对象建创表列:

    

    稍后我们将看到更多返回可代迭对象的函数和使可代迭对象作为数参的函数。

    

4.4 break和continue语句,循环的else从句

    break语句,和C里差不多,止终小最的闭封的for或while循环。

    循环语句可以有一个else从句,这个从句是在循环是通过表列耗尽而止终(for语句)或循环条件变成false(while语句)时执行,当循环是通过break语句止终时不并执行。下面的循环就是它的型典,查找质数:

    

    (这是确准的码代。esle从句属于for循环,而不是if语句。)

    当用于循环时,else从句与if语句的else从句比拟,它和try语句的else从句有更多的共同之处。try语句的else从句当没有常异生发时执行,循环的else从句当没有break生发时执行。

    continue语句,也是从C面里照搬来过的,止停本次循环,续继下次循环:

    

    

4.5 pass语句

    pass语句什么都不做,它适于用当从语法上讲要求有一个语句,但是从序程来讲不需要执行动作。例如:

    

    它平日用于建创小最化的类:

    

    另一个pass可以应用的方地是作为函数的占位符或者当你写新码代时的条件体,许允你在更抽象的级别思考。pass语句会被静安的疏忽:

    

    

4.6 定义函数

    我们可以建创一个函数来输出意任边界的斐波那契序列:

    

    关键字def明表这是一个函数定义。它面后必须跟一个函数称名和括号括起来的情势数参表列。从下一行开始,语句构成了函数体,它们必须缩进。

    函数体的第一条语句可选为一个字符串字面量,这个字符串字面量是函数的文档字符串。有一些具工应用这些文档字符串主动生产在线的或打印的文档,或让用户互交的通过码代览浏,当你写码代的时候加上文档字符串是一个很好的践实,并使它成为一种习气。

    函数的执行引进一个新的符号表被函数的当地变量应用。更加确准的说,一个函数里全体的变量赋值都把值存储到了当地符号表,然后变量用引首先搜索当地变量表,然后闭封函数的当地变量表,然后全局符号表,最后内建称名表。因此,全局变量不能在一个函数面里直接被赋值(除非被定名在一个global语句中),虽然它们可以被用引到。

    当一个函数被调用时,这个函数调用的现实数参被引入到被调函数的当地符号表,因此,数参是通过传值传递的(这个值是总对象用引,不是对象的值)。当一个函数调用另一个函数时,一个新的当地符号表被建创为了那个调用。

    函数定义把函数称名引入到前当符号表。函数称名的值有一个类型,这个类型被解释器作为用户定义函数来认知。这个值可以被赋给另外一个称名,它也被作为函数应用。它是由通用定名机制现实的:

    

    对于其它言语来讲,fib对象不是一个函数,而是一个程过,因为它不返回值。事实上,即使函数没有一个return语句也会返回一个值,即使是一个无聊的值。这个值叫做None(这个一个内建的名字)。写入值None平日会被解释器阻挠,如果它是唯一被写的值。如果你真的想看它的话就应用print():

    

    写一个函数把斐波那契序列作为表列返回非常简略,而不是打印它:

    

    这个示例演示了一些Python新特性:

    

  • return语句从函数返回一个值。return面后如果没有跟表达式就返回None。如果没有到函数结束的话也返回None。
  • 语句result.append(a)调用了表列对象result的一个法方。一个法方就是一个函数,这个函数属于一个对象,被定名为obj.methodname,这里的obj是某个对象(可是以一个表达式),methodname是被这个对象类型定义的一个法方的名字。不同的类型定义不同的法方。不同类型的法方可以有拥样同的名字,不会因此歧义。示例面里的append()法方是为表列对象定义的,它在表列的尾末加添一个新元素。在这个示例面里它等同于result = result + [a],但是更效有。

    

4.7 更多有关定义函数

    也可以定义有可变数目数参的函数。数参有三种情势,它们可以结合在一起。

    

4.7.1 数参的认默值

    最效有的情势是为一个或多个数参指定认默值。这样建创的函数在调用时可以传入比定义时更少的数参。例如:

    

    这个函数可以以几种式方调用:

    

  • 只给出必须的数参: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, only yes or no!')

    这个示例也绍介了in关键字,来测试一个序列是不是包括一个肯定的值。

    这些认默值在函数定义的时候被算计,是在定义的围范中。所以:

    

    将打印5。

    要重正告:认默值只被算计一次。当认默值是一个可变对象时会有一个不同之处,如表列,字典或多许类的实例。下面的函数在后续的调用中会积累传给它的数参:

    

    这将打印:

    

    如果你不想这些认默的数参在后续的调用中同享,你可以像这样来现实函数:

    

    

4.7.2 关键字数参

    函数也可以应用kwarg=value种这情势的关键字数参停止调用。例如,下面这个函数:

    

    收接一个必填的数参(vltage)和三个可选的数参(state,action,和type)。可以应用下面的任何一种式方调用:

    

    但是下面的调用都是正当的:

    

    在一个函数调用中,关键字数参必须跟在置位数参面后。全体被传进去的关键字数参必须匹配这个函数收接数参中的一个(actor对函数parrot是一个正当的数参),它们的次序不并要重。这样同包括非可选数参(parrot(voltage=1000)是正当的)。没有数参可以多次收接一个值。这个示例是失败的由于这个约束:

    

    当最后一个情势数参是以**name种这情势出现的,它将收接一个字典包括全体的除了那些情势数参以外的全体关键字数参。它可以和*name种这情势的情势数参结合起来,它收接一个元祖包括超出情势数参以外的全体置位数参。*name必须在**name前面。例如,如果我们定义一个函数像这样:

    

    它可以像这样被调用:

    

    当然,它将打印:

    

    注意,关键字数参称名的表列是在打印出它们的内容前通过对关键字字典的keys()法方的结果停止排序而建创的;如果不这样做的话,表列面里的数参被打印的次序是没有定义的。

    

4.7.3 意任数参表列

    最后,应用频率最少的是一个函数可以应用意任数目的数参停止调用。这些数参将被包装在一个元祖面里。在这些可变数目数参之前,可以有零或多个情势数参:

    

    平日,这些可变数参都在形参表列的最面后,因为它们收集全体传入函数的剩余的输入数参。出现在*args面后的任何情势数参只能是关键字数参,意味着它们只能用作关键字数参而不是置位数参:

    

    

4.7.4 解压数参表列

    当数参经已在一个表列里或元祖里,但是函数调用需要解压它们成为单独的置位数参,这是相反的情况就生发了。例如,内建range()函数希望单独的开始和结束数参。如果它们不能单独的得到,函数调用时应用*作操符来把数参从表列或元祖中解压出来:

    

    以样同的式方,字典可以应用**作操符来分发关键字数参:

    

    

4.7.5 lambda情势

    通过大众需求,很少的一些平日在函数式编程言语(像Lisp)里被发现的新特性经已被加添到Python里。应用lambda关键字,很小的匿名函数可以被建创。这是一个返回它的两个数参之和的函数:lambda a, b: a+b。lambda情势可以应用在任何要求函数对象的方地。它们在语法上限制为一个单一的表达式。在语义上,它们仅仅是正常函数定义的语法糖。像嵌套函数定义,lambda情势可以用引来自于包括它的围范面里的变量:

    

    本文是对官方网站内容的翻译,原文地址:http://docs.python.org/3/tutorial/controlflow.html

文章结束给大家分享下程序员的一些笑话语录: 人工智能今天的发展水平:8乘8的国际象棋盘其实是一个体现思维与创意的强大媒介。象棋里蕴含了天文数字般的变化。卡斯帕罗夫指出,国际象棋的合法棋步共有1040。在棋局里每算度八步棋,里面蕴含的变化就已经超过银河系里的繁星总数。而地球上很少有任何数量达到这个级别。在金融危机之前,全世界的财富总和大约是1014人民币,而地球人口只有1010。棋盘上,所有可能的棋局总数达到10120,这超过了宇宙里所有原子的总数!经典语录网

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics