Python 学习笔记 - 第二天

1.if 语句

>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...      x = 0
...      print('Negative changed to zero')
... elif x == 0:
...      print('Zero')
... elif x == 1:
...      print('Single')
... else:
...      print('More')
...
More

2.for 语句

类似 for-each 循环

>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12

在迭代循环过程中, 不要去做可能修改序列尺寸的操作, 否则易导致奇怪的 bug.
如果需要做这种修改操作, 可以使用序列切片来做一个副本, 即可避免这种不安全的操作.

>>> for w in words[:]:
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']

3.range() 函数

内置函数 range() 将生成一个等差级数链表

>>> for i in range(5):
...     print(i)
...
0
1
2
3
4

range() 函数有三个参数, 第一个参数为起始值, 第二个参数为结束值(不包括在范围内), 第三个参数为步进值('步长').

>>> range(5, 10)
   5 through 9

>>> range(0, 10, 3)
   0, 3, 6, 9

>>> range(-10, -100, -30)
  -10, -40, -70

如果迭代时要使用索引, 可以结合使用 range() 和 len() (mark: 还有个 enumerate() 函数可以解决这种需求)

>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb

如果直接打印 range() 函数的话…

>>> print(range(10))
range(0, 10)

range() 是一个可迭代的对象. 
使用 list() 函数可以迭代这个序列:

>>> list(range(5))
[0, 1, 2, 3, 4]

4.break 和 continue 语句, 以及循环中的 else

循环中的 else 表示在迭代完整个序列后(for) 或执行结果为 false (while) 时执行. 但循环被 break 中止的情况下不会执行这个 else.
以下为搜索素数的示例:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

breakcontinue 语句和 C 、java 中的类似.

>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print("Found an even number", num)
...         continue
...     print("Found a number", num)
...
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9

5.pass 语句

pass 语句表示什么也不做.

>>> while True:
...     pass
...

通常用于创建最小结构的类:

>>> class MyEmptyClass:
...     pass
...

定义函数时

>>> def initlog(*args):
...     pass   # TODO
...

6.定义函数

关键字 def 引入了一个函数定义.
函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring.
定义一个生成斐波那契数列的函数:

>>> def fib(n):
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

函数指向的地址值可以赋值给另一个名字, 这个名字也可以当作这个函数使用. 相当于重命名.

>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89

没有 return 的函数默认也会返回一个值 None.

>>> fib(0)
>>> print(fib(0))
None

定义一个返回斐波那契数列数字列表的函数:

>>> def fib2(n):
...     """Return a list containing the Fibonacci series up to n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)    # see below
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)
>>> f100
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

6.1.默认参数

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
    while True:
        ok = input(prompt)
        if ok in ('y', 'ye', 'yes'):
            return True
        if ok in ('n', 'no', 'nop', 'nope'):
            return False
        retries = retries - 1
        if retries < 0:
            raise OSError('uncooperative user')
        print(complaint)

in 关键字, 测定序列中是否包含某个值.
该函数有几种调用方式:

  • 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!')

  • 默认值可以使用变量赋值, 但只被赋值一次. 当默认值为可变对象时, 例如列表、字典等, 默认值会随之变化而变化.

    >>> def f(a, L=[]):
    ...     L.append(a)
    ...     return L
    ...
    >>> print(f(1))
    [1]
    >>> print(f(2))
    [1, 2]
    >>> print(f(3))
    [1, 2, 3]

    如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:

    def f(a, L=None):
        if L is None:
            L = []
        L.append(a)
        return L

    6.2.关键字参数

    举例函数

    def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
        print("-- This parrot wouldn't", action, end=' ')
        print("if you put", voltage, "volts through it.")
        print("-- Lovely plumage, the", type)
        print("-- It's", state, "!")

    这个函数可以使用以下方式调用:

  • parrot(1000)

  • parrot(voltage=1000)

  • parrot(voltage=1000000, action='VOOOOOM')

  • parrot(action='VOOOOOM', voltage=1000000)

  • parrot('a million', 'bereft of life', 'jump')

  • parrot('a thousand', state='pushing up the daisies')

  • 无效调用举例:

  • parrot() # 没有传必选参数

  • parrot(voltage=5.0, 'dead') # 在关键字参数后也必须用关键字传参数

  • parrot(110, voltage=220) # 参数重复传递

  • parrot(actor='John Cleese') # 未知参数名

  • 可以使用 *name 来接收一个元组, 使用 **name 来接收一个字典. 并且 *name 必须在 **name 之前.
    示例:

    def cheeseshop(kind, *arguments, **keywords):
        print("-- Do you have any", kind, "?")
        print("-- I'm sorry, we're all out of", kind)
        for arg in arguments:
            print(arg)
        print("-" * 40)
        keys = sorted(keywords.keys())
        for kw in keys:
            print(kw, ":", keywords[kw])

    调用方式:

    cheeseshop("Limburger", "It's very runny, sir.",
               "It's really very, VERY runny, sir.",
               shopkeeper="Michael Palin",
               client="John Cleese",
               sketch="Cheese Shop Sketch")

    打印结果:

    -- Do you have any Limburger ?
    -- I'm sorry, we're all out of Limburger
    It's very runny, sir.
    It's really very, VERY runny, sir.
    ----------------------------------------
    client : John Cleese
    shopkeeper : Michael Palin
    sketch : Cheese Shop Sketch

    sorted() 可以用来排序一个序列.

    6.3.可变参数列表

    使用元组来接收可变参数, 一般示例:

    def write_multiple_items(file, separator, *args):
        file.write(separator.join(args))

    在可变参数之后, 只能使用关键字参数.

    >>> def concat(*args, sep="/"):
    ...    return sep.join(args)
    ...
    >>> concat("earth", "mars", "venus")
    'earth/mars/venus'
    >>> concat("earth", "mars", "venus", sep=".")
    'earth.mars.venus'

    6.4.参数列表的拆分

    使用 * 将列表自动拆分成多个参数进行传递.

    >>> list(range(3, 6))
    [3, 4, 5]
    >>> args = [3, 6]
    >>> list(range(*args))
    [3, 4, 5]

    使用 ** 将字典拆分成多个关键字参数进行传递.

    >>> def parrot(voltage, state='a stiff', action='voom'):
    ...     print("-- This parrot wouldn't", action, end=' ')
    ...     print("if you put", voltage, "volts through it.", end=' ')
    ...     print("E's", state, "!")
    ...
    >>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
    >>> parrot(**d)
    -- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

    6.5.使用 Lambda 表达式.

    >>> def make_incrementor(n):
    ...     return lambda x: x + n
    ...
    >>> f = make_incrementor(42)
    >>> f(0)
    42
    >>> f(1)
    43

    将 lambda 函数作为参数传递:

    >>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
    >>> pairs.sort(key=lambda pair: pair[1])
    >>> pairs
    [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

    6.6.文档字符串

    第一行是关于对象用途的简介, 以大学字母开头, 以句号结束.
    如果有多行文档字符串, 第二行应该空出来, 第三行开始详细描述.
    需要自行清除空白缩进.
    示例:

    >>> def my_function():
    ...     """Do nothing, but document it.
    ...
    ...     No, really, it doesn't do anything.
    ...     """
    ...     pass
    ...
    >>> print(my_function.__doc__)
    Do nothing, but document it.

        No, really, it doesn't do anything.

    6.7.函数注解

    注解以字典的形式存储在函数的 __annotations__ 属性中

  • 参数注解, 定义在参数名称的冒号后面

  • 返回注释, 定义在函数的 -> 和冒号之间

  • >>> def f(ham: 42, eggs: int = 'spam') -> "Nothing to see here":
    ...     print("Annotations:", f.__annotations__)
    ...     print("Arguments:", ham, eggs)
    ...
    >>> f('wonderful')
    Annotations: {'eggs': <class 'int'>, 'return': 'Nothing to see here', 'ham': 42}
    Arguments: wonderful spam

    7.一些编码风格

  • 使用 4 空格缩进,而非 TAB.

  • 折行以确保其不会超过 79 个字符.

  • 使用空行分隔函数和类,以及函数中的大块代码

  • 可能的话,注释独占一行

  • 使用文档字符串

  • 把空格放到操作符两边,以及逗号后面,但是括号里侧不加空格:a = f(1, 2) + g(3, 4)

  • 统一函数和类命名, 推荐类名用 驼峰命名, 函数和方法名用 小写下划线, 总是用 self 作为方法的第一个参数.

  • 不要使用花哨的编码,如果你的代码的目的是要在国际化环境。Python 的默认情况下,UTF-8,甚至普通的 ASCII 总是工作的最好.

  • 同样,也不要使用非 ASCII 字符的标识符,除非是不同语种的会阅读或者维护代码。

  • ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 213,099评论 6 492
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 90,828评论 3 387
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 158,540评论 0 348
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 56,848评论 1 285
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 65,971评论 6 385
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 50,132评论 1 291
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 39,193评论 3 412
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 37,934评论 0 268
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 44,376评论 1 303
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 36,687评论 2 327
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 38,846评论 1 341
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 34,537评论 4 335
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 40,175评论 3 317
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 30,887评论 0 21
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 32,134评论 1 267
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 46,674评论 2 362
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 43,741评论 2 351

    推荐阅读更多精彩内容

    • 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Py...
      Jaesoon阅读 176评论 0 0
    • 4. 流程控制语句 除了 while 语句,Python还拥有在其他语言里常见的控制语句,以及一些好玩的语句。 4...
      慧琴如翌阅读 533评论 0 0
    • 第六章:数字 第七章:序列,列表,元组 1.序列 序列类型有着相同的访问模式:它的每一个元素可以通过指定一个偏移量...
      m风满楼阅读 882评论 0 2
    • 人总是拿一件不确定的事,加一段自己的臆想,然后边恐吓自己边安慰自己,狂作一段时间,啥事没有,顿时又觉世界无限美好,...
      齐刘海的华阅读 217评论 0 0
    • 戴运鹏阅读 118评论 0 0