Python 学习笔记

Python 学习笔记

0 IDEA设置

  1. 导入本地py文件时,模块下方出现红色波浪线时如何解决

    1. 进入设置,找到Console下的Python Console,勾选选项“Add source roots to PYTHONPAT”
    2. 在当前项目程序目录右键单击,然后“Mark Directory as”为“Sources Root”

1 Python 特点

  • Python是一种解释型语言,不需要编译和链接。

  • Python程序的书写是紧凑而易读的。

    • 高级数据类型允许在一个表达式中表示复杂的操作;
    • 代码块的划分是按照缩进而不是成对的花括号;
    • 不需要预先定义变量或参数。
  • Python是“可扩展的”:

    如果你知道怎么写C语言程序,就能很容易地给解释器添加新的内置函数或模块,不论是让关键的程序以最高速度运行,还是把Python程序链接到只提供预编译程序的库(比如硬件相关的图形库)。

2 Python 解释器

2.1 命令行常用输入

  • 启动解释器 python3.7
  • 结束命令 Ctrl-Z 或者 quit()
  • 执行指令 python -c command [arg] ...
  • 执行模块 python -m module [arg] ...

2.2 源文件的字符编码

  • 默认编码:UTF-8
  • 声明文件所使用的编码

文件的 第一 行要写成特殊的注释# -*- coding: encoding -*- ,其中 encoding 可以是 Python 支持的任意一种 codecs。

2.3 清屏命令

import os
os.system('cls')

2.4 python版本切换

# python2.7
py -2
# python3.7
py -3

3 Python 作为计算器使用

3.1 数字直接计算

  • 以使用 ** 运算符来计算乘方

  • 在交互模式下,上一次打印出来的表达式被赋值给变量 _。

  • 单斜杠和双斜杠的区别

    • python中单斜杠返回float,就算参与运算的是整型也会返回float型

    • 双斜杠表示地板除法,向下取整,至少有一方是浮点型时,返回类型是浮点型,但是依然是整数

    >>> 1/3
    0.3333333333333333
    >>> 1.0/3
    0.3333333333333333
    >>> 1//3
    0
    >>> 1.0//3
    0.0
    >>> 1.0//3.0                                                                               
    0.0 
    >>> -2//3 # 向下取整
    -1
    >>> -2.0//3
    -1.0
    

3.2 字符串

  • 使用单引号('……'),双引号("……"):会输出引号

  • 反斜杠 \ 可以用来转义

  • print() 函数会生成可读性更强的输出,即略去两边的引号,并且打印出经过转义的特殊字符

    • 如果你不希望前置了 \ 的字符转义成特殊字符,可以使用 原始字符串 方式,在引号前添加 r 即可
    • print字符串前面加 f 表示格式化字符串,加f后可以在字符串里面使用用花括号括起来的变量和表达式
  • 字符串字面值可以跨行连续输入。

    一种方式是用三重引号:"""...""" 或 '''...'''。字符串中的回车换行会自动包含到字符串中,如果不想包含,在行尾添加一个 \ 即可。

  • 字符串可以用 + 进行连接(粘到一起),也可以用 * 进行重复

  • 相邻的两个或多个 字符串字面值 (引号引起来的字符)将会自动连接到一起.

  • 字符串是可以被 索引 (下标访问)的,第一个字符索引是 0,索引也可以用负数,这种会从右边开始数:

  • 除了索引,字符串还支持 切片,切片的索引有默认值。获取子字符串:word[0:2],word[:2],word[4:],word[-2:]

  • Python 中的字符串不能被修改,它们是 immutable 的

    因此,向字符串的某个索引位置赋值会产生一个错误

  • 内建函数 len() 返回一个字符串的长度

3.3 列表

  • 列表也支持索引和切片

    所有的切片操作都返回一个新列表,这个新列表包含所需要的元素。就是说,如下的切片会返回列表的一个新的(浅)拷贝:

  • 与 immutable 的字符串不同, 列表是一个 mutable 类型,就是说,它自己的内容可以改变

  • append() 方法 添加新元素

3.2 走向编程的第一步

# Fibonacci series:
# the sum of two elements defines the next
a, b = 0, 1
while a < 10:
    print(a)
    a, b = b, a+b
  1. 第一行含有一个 多重赋值: 变量 a 和 b 同时得到了新值 0 和 1

  2. while 循环只要它的条件(这里指: a < 10)保持为真就会一直执行

  3. 循环体 是 缩进的 :缩进是 Python 组织语句的方式。注意,在同一块语句中的每一行,都要缩进相同的长度。

  4. 交互式命令行里,当一个组合的语句输入时, 需要在最后敲一个空白行表示完成(因为语法分析器猜不出来你什么时候打的是最后一行)。

  5. print() 函数将所有传进来的参数值打印出来。

    • 字符串会打印不带引号的内容, 并且在参数项之间会插入一个空格, 这样你就可以很好的把东西格式化。
    • 关键字参数 end 可以用来取消输出后面的换行print(a, end=',')

4 流程控制工具

4.1 if 语句

关键字 'elif' 是 'else if' 的缩写,适合用于避免过多的缩进。

4.2 for 语句

  1. Python 中的 for 语句是对任意序列进行迭代(例如列表或字符串),条目的迭代顺序与它们在序列中出现的顺序一致。

  2. 如果在循环内需要修改序列中的值(比如重复某些选中的元素),推荐你先拷贝一份副本(可利用切片words[:])。

4.3 range() 函数

  1. 遍历一个数字序列 range(10)、range(5, 10)

  2. range也可以以另一个数字开头,或者以指定的幅度增加(甚至是负数;有时这也被叫做 '步进')range(0, 10, 3)

  3. range() 所返回是 可迭代的对象 ,适合作为函数和结构体的参数,这些函数和结构体期望在迭代结束之前可以从中获取连续的元素。

4.4 break 和 continue 语句,以及循环中的 else 子句

循环语句可能带有一个 else 子句;它会在循环遍历完列表 (使用 for) 或是在条件变为假 (使用 while) 的时候被执行,但是不会在循环被 break 语句终止时被执行。

4.5 pass 语句

pass 语句什么也不做。

4.6 定义函数

Fibonacci 数列的函数:

def fib(n):    # write Fibonacci series up to n
    """Print a Fibonacci series up to n."""
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

# Now call the function we just defined:
fib(2000)
  1. 关键字 def

  2. 函数体的第一个语句是函数的文档字符串或 docstring 。

  3. 函数的 执行 会引入一个用于函数局部变量的新符号表。

  4. 在函数被调用时,实际参数(实参)会被引入被调用函数的本地符号表中;

  5. 实参是通过 按值调用 传递的(其中 值 始终是对象 引用 而不是对象的值)。

  6. 函数定义会把函数名引入当前的符号表中。

4.7 函数定义的更多形式

  1. 参数默认值

    1. 最有用的形式是对一个或多个参数指定一个默认值。

    2. 重要警告: 默认值只会执行一次。默认值为可变对象(列表、字典以及大多数类实例)时,修改会导致后面调用的值改变。

  2. 关键字参数

    使用形如 kwarg=value 的 关键字参数 来调用函数。

  3. 任意的参数列表

    1. *name 参数表示零个或多个普通参数

    2. **name 的形式参数时,它会接受一个字典(参见 映射类型 --- dict )字典中包含了所有除了与形式参数对应的其他关键字参数

    3. *name 必须在出现在 **name 之前

  4. 解包参数列表

      • 运算符编写函数调用以从列表或元组中解包参数
    1. 字典可以使用 ** 运算符来提供关键字参数

  5. Lambda 表达式

    用 lambda 关键字来创建一个小的匿名函数 return lambda x: x + n

4.8 文档字符串和函数标注

  • 第一行应该是对象目的的简要概述 , 这一行应以大写字母开头,以句点结尾。
  • 如果文档字符串中有更多行,则第二行应为空白,从而在视觉上将摘要与其余描述分开
  • __doc__获取文档字符串
  • 函数标注 以字典的形式存放在函数的 __annotations__ 属性

5 数据结构

5.1 列表的更多特性

  1. 列表作为栈使用“后进先出”:append(i),pop()

  2. 列表作为队列使用“先进先出”:因为所有的其他元素都必须移动一位,相当低效,使用 collections.deque替代

  3. 列表推导式:[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

  4. 嵌套的列表推导式: [[row[i] for row in matrix] for i in range(4)]

5.2 del 语句

按索引移除一个元素、移除切片、清空整个列表、删除整个变量

5.3 元组和序列

  1. 元组是 immutable (不可变的),列表是 mutable (可变的)
  2. 元组在输出时总是被圆括号包围的,以便正确表示嵌套元组
  3. 输入时圆括号可有可无,不过经常会是必须的(如果这个元组是一个更大的表达式的一部分)

5.4 集合

花括号或 set() 函数可以用来创建集合,集合也支持推导式形式

5.5 字典

  1. 空字典:{},相当于map

5.6 循环的技巧

  1. 当在字典中循环时,用 items() 方法可将关键字和对应的值同时取出

  2. 当在序列中循环时,用 enumerate() 函数可以将索引位置和其对应的值同时取出

  3. 当同时在两个或更多序列中循环时,可以用 zip() 函数将其内元素一一匹配。

    zip返回一个元组,其中第i个元素来自第i个可迭代参数

  4. 当逆向循环一个序列时,先正向定位序列,然后调用 reversed() 函数

  5. 如果要按某个指定顺序循环一个序列,可以用 sorted() 函数,它可以在不改动原序列的基础上返回一个新的排好序的序列

5.7 深入条件控制

  1. while 和 if 条件句中可以使用任意操作,而不仅仅是比较操作。

  2. 比较操作符 in 和 not in 校验一个值是否在(或不在)一个序列里 。

  3. 操作符 is 和 is not 比较两个对象是不是同一个对象,这只跟像列表这样的可变对象有关。

  4. 所有的比较操作符都有相同的优先级,且这个优先级比数值运算符低。

  5. 比较操作可以传递。

    例如 a < b == c 会校验是否 a 小于 b 并且 b 等于 c。

  6. 比较操作可以通过布尔运算符 and 和 or 来组合,并且比较操作(或其他任何布尔运算)的结果都可以用 not 来取反。

    • 这些操作符的优先级低于比较操作符
    • not 优先级最高, or 优先级最低 , 可以在这种式子里使用圆括号
    • 布尔运算符 and 和 or 也被称为 短路 运算符:它们的参数从左至右解析,一旦可以确定结果解析就会停止。

注意 Python 与 C 不同,赋值操作不能发生在表达式内部。

6 模块

  1. 模块是一个包含Python定义和语句的文件

  2. 文件名就是模块名后跟文件后缀 .py

    import fibo  # 导入模块
    fib = fibo.fib   # 把模块赋值给一个局部变量
    fib(500)
    
  3. 仅在模块 第一次 在 import 语句中被导入时才执行初始化

  4. 每个模块都有它自己的私有符号表,该表用作模块中定义的所有函数的全局符号表

    • 模块的作者可以在模块内使用全局变量,而不必担心与用户的全局变量发生意外冲突

    • 访问一个模块的全局变量,modname.itemname

    • 模块可以导入其它模块。习惯上但不要求把所有 import 语句放在模块(或脚本)的开头。被导入的模块名存放在调入模块的全局符号表中。

      import 语句有一个变体,它可以把名字从一个被调模块内直接导入到现模块的符号表里。例如:

      >>> from fibo import fib, fib2  # 这里只引入指定函数
      >>> fib(500)
      0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
      

      这并不会把被调模块名引入到局部变量表里(因此在这个例子里,模块fibo 是未被定义的)

  5. 以脚本的方式执行模块

    python fibo.py <arguments>
    

    解析命令行的代码只有在当模块是以“main”文件的方式执行的时候才会运行,需要在模块末尾添加这些代码

    if __name__ == "__main__":
        import sys
        fib(int(sys.argv[1]))
    

7 输入输出

  • 格式化字符串字面值 f或F

  • str.format()

    yes_votes = 42_572_654
    no_votes = 43_132_495
    percentage = yes_votes / (yes_votes + no_votes)
    '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)
    
  • 转化为字符串: repr() or str() 函数

posted @ 2019-11-29 20:39  jarvankuo  阅读(186)  评论(0)    收藏  举报