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. whileif 条件句中可以使用任意操作,而不仅仅是比较操作。

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

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

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

  5. 比较操作可以传递。

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

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

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

注意 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  阅读(145)  评论(0编辑  收藏  举报