python基础补习

  1. python是一门解释型语言

  2. 控制台输出语句print("hello python")

  3. $ sudo apt install ipython 安装比较好用的python命令行工具

  4. Python 的 IDE —— PyCharm

  5. 注释

  6. # 这是第一个单行注释
    """
    这是一个多行注释
    在多行注释之间,可以写很多很多的内容……
    """ 
    
  7. 特殊算数运算符

    // 取整除 返回除法的整数部分(商) 9 // 2 输出结果 4
    ** 又称次方、乘方,2 ** 3 = 8
  8. * 运算符还可以用于字符串,计算结果就是字符串重复指定次数的结果

    In [1]: "-" * 50
    Out[1]: '----------------------------------------' 
    

    数字型变量 和 字符串 之间 不能进行其他计算

  9. type(x) 查看 x 的变量类型

  10. 键盘输入

    字符串变量 = input("提示信息:")
    
  11. 格式化字符

    print("我的名字叫 %s,请多多关照!" % name)
    print("我的学号是 %06d" % student_no) # 000001
    print("苹果单价 %.02f 元/斤,购买 %.02f 斤,需要支付 %.02f 元" % (price, weight, money))
    print("数据比例是 %.02f%%" % (scale * 100))
    
  12. if else

    if 条件1:
        ……
    elif 条件2:
        ……
    else:
        ……
    
  13. and or not

    条件1 and 条件2
    条件1 or 条件2
    not 条件
    
  14. 定义函数的格式如下

    def 函数名():
        函数封装的代码
        ……
    
  15. pyc文件

    c是compiled的意思

浏览程序目录会发现一个 pycache 的目录
目录下会有类似 xxx.cpython-35.pyc 的文件,cpython-35 表示 Python 解释器的版本
这个 pyc 文件是由 Python 解释器将 模块的源码 转换为 字节码
Python 这样保存 字节码 是作为一种启动 速度的优化

  • Python 在解释源程序时是分成两个步骤的
    1. 首先处理源代码,编译 生成一个二进制 字节码
    2. 再对 字节码 进行处理,才会生成 CPU 能够识别的 机器码
  • 有了模块的字节码文件之后,下一次运行程序时,如果在 上次保存字节码之后 没有修改过源代码,Python 将会加载 .pyc 文件并跳过编译这个步骤
  • Python 重编译时,它会自动检查源文件和字节码文件的时间戳
  • 如果你又修改了源代码,下次程序运行时,字节码将自动重新创建
  1. 在 Python 中,所有 非数字型变量 都支持以下特点:

    • 都是一个 序列 sequence,也可以理解为 容器
    • 取值[]
    • 遍历 for in
    • 计算长度、最大 / 最小值、比较、删除
    • 链接+ 和 重复*
    • 切片
  2. 列表 其他语言经常叫数组

    name_list = ["zhangsan", "lisi", "wangwu"]
    
  3. 列表常用操作

    序号 分类 关键字 / 函数 / 方法 说明
    1 增加 列表.insert (索引,数据) 在指定位置插入数据
    列表.append (数据) 在末尾追加数据
    列表.extend (列表 2) 将列表 2 的数据追加到列表
    2 修改 列表 [索引] = 数据 修改指定索引的数据
    3 删除 del 列表 [索引] 删除指定索引的数据
    列表.remove [数据] 删除第一个出现的指定数据
    列表.pop 删除末尾数据
    列表.pop (索引) 删除指定索引数据
    列表.clear 清空列表
    4 统计 len (列表) 列表长度
    列表.count (数据) 数据在列表中出现的次数
    5 排序 列表.sort () 升序排序
    列表.sort (reverse=True) 降序排序
    列表.reverse () 逆序、反转

    【注】如果使用 del 关键字将变量从内存中删除,后续的代码就不能再使用这个变量了

  4. Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改

    info_tuple = ("zhangsan", 18, 1.75)
    # 元组中 只包含一个元素 时,需要 在元素后面添加逗号
    info_tuple = (50, )
    # 数据在元祖中出现的次数
    info_tuple.count(数据)
    # 数据第一次出现的索引
    info_tuple.index(数据)
    
  5. 元组和列表之间的转换

    list(元组) 
    tuple(列表)
    
  6. 字典

    字典[key] key不存在会报错
    del 字典[key] key不存在会报错
    字典.pop(key) key不存在会报错
    字典.setdefault(key, value) key不存在添加key value,key存在不做操作           
    字典.clear       字典.items 所有(key,value)元组列表      字典.setdefault
    字典.copy        字典.keys        字典.update(字典2) 字典2的数据合并到字典
    字典.fromkeys    字典.pop         字典.values
    字典.get         字典.popitem    
    
  7. 字符串截取(列表和元组同理)

    num_str = "0123456789"
    # 1. 截取从 2 ~ 5 位置 的字符串
    print(num_str[2:6])
    # 2. 截取从 2 ~ `末尾` 的字符串
    print(num_str[2:])
    # 3. 截取从 `开始` ~ 5 位置 的字符串
    print(num_str[:6])
    # 4. 截取完整的字符串
    print(num_str[:])
    # 5. 从开始位置,每隔一个字符截取字符串
    print(num_str[::2])
    # 6. 从索引 1 开始,每隔一个取一个
    print(num_str[1::2])
    # 倒序切片
    # -1 表示倒数第一个字符
    print(num_str[-1])
    # 7. 截取从 2 ~ `末尾 - 1` 的字符串
    print(num_str[2:-1])
    # 8. 截取字符串末尾两个字符
    print(num_str[-2:])
    # 9. 字符串的逆序(面试题)
    print(num_str[::-1])
    
  8. 容器运算符

    运算符 Python 表达式 结果 描述 支持的数据类型
    + [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串、列表、元组
    * ["Hi!"] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重复 字符串、列表、元组
    in 3 in (1, 2, 3) True 元素是否存在 字符串、列表、元组、字典
    not in 4 not in (1, 2, 3) True 元素是否不存在 字符串、列表、元组、字典
    > >= == < <= (1, 2, 3) < (2, 2, 3) True 元素比较 字符串、列表、元组
  9. for else语法对,真是很费解干什么用

    for 变量 in 集合: 
        循环体代码
    else:
        没有通过 break 退出循环,循环结束后,会执行的代码
    
  10. pass 是空语句,占位用

  11. LINUX 上的 Shebang 符号 (#!)

    #! 这个符号叫做 Shebang 或者 Sha-bang
    Shebang 通常在 Unix 系统脚本的中 第一行开头 使用
    指明 执行这个脚本文件 的 解释程序
    比如在一个.py文件的第一行加入#! /usr/bin/python3, 就可以直接在shell中敲入这个文件的路径,就会用python3解释运行
    
  12. 哈希 (hash)

    • Python 中内置有一个名字叫做 hash(o) 的函数
      • 接收一个 不可变类型 的数据作为 参数
      • 返回 结果是一个 整数
    • 哈希 是一种 算法,其作用就是提取数据的 特征码(指纹)
      • 相同的内容 得到 相同的结果
      • 不同的内容 得到 不同的结果
    • Python 中,设置字典的 键值对 时,会首先对 key 进行 hash 已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查
      • 键值对的 key 必须是不可变类型数据
      • 键值对的 value 可以是任意类型的数据
  13. 函数不能直接修改 全局变量的引用

  14. 函数不能直接修改 全局变量的值

    num = 10
    def demo1():
        # global 关键字,告诉 Python 解释器 num 是一个全局变量
        global num
        num = 100 # 如果没有上面的global num 这里只会定义一个局部变量
        print(num)
    
  15. 调用函数时,如果有 多个缺省参数需要指定参数名,这样解释器才能够知道参数的对应关系!

```python
def print_info(name, title="", gender=True):
    ...
print_info("小明")
print_info("老王", title="班长")
print_info("小美", gender=False)
```
  1. 有时可能需要 一个函数 能够处理的参数 个数 是不确定的,这个时候,就可以使用 多值参数

    python 中有 两种 多值参数:

    • 参数名前增加 一个 * 可以接收 元组
    • 参数名前增加 两个 * 可以接收 字典

    一般在给多值参数命名时,习惯使用以下两个名字

    • *args —— 存放 元组 参数,前面有一个 *
    • **kwargs —— 存放 字典 参数,前面有两个 *

    argsarguments 的缩写,有变量的含义

    kwkeyword 的缩写,kwargs 可以记忆 键值对参数

def demo(num, *args, **kwargs):
    print(num)
    print(args)
    print(kwargs)
demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
""""
1
(2, 3, 4, 5)
{'name': '小明', 'age': 18, 'gender': True}
""""
  1. 元组和字典的拆包

    在调用带有多值参数的函数时,如果希望:

    • 将一个 元组变量,直接传递给 args
    • 将一个 字典变量,直接传递给 kwargs

    就可以使用 拆包,简化参数的传递,拆包 的方式是:

    • 元组变量前,增加 一个 *
    • 字典变量前,增加 两个 *
demo(*tuple, **dic)
  1. 使用内置函数 dir 传入 标识符 / 数据,可以查看对象内的 所有属性及方法

  2. 类的定义

    class Cat:
        def __init__(self):
            print("这是一个初始化方法")
            # 定义用 Cat 类创建的猫对象都有一个 name 的属性
            self.name = "Tom"
        def eat(self):
            print("%s 爱吃鱼" % self.name)
    # 使用类名()创建对象的时候,会自动调用初始化方法 __init__
    tom = Cat()
    tom.eat()
    
  3. 在类封装的方法内部,self 就表示 当前调用方法的对象自己 在调用方法时不用穿self这个参数

  4. 内置方法和属性

    序号 方法名 类型 作用
    01 __del__ 方法 对象被从内存中销毁前,会被 自动 调用
    02 __str__ 方法 返回对象的描述信息print 函数输出使用
  5. 身份运算符

    运算符 描述 实例
    is is 是判断两个标识符是不是引用同一个对象 x is y,类似 id (x) == id (y)
    is not is not 是判断两个标识符是不是引用不同对象 x is not y,类似 id (a) != id (b)

    Python 中针对 None 比较时,建议使用 is 判断

  6. 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法

  7. Python 中,并没有 真正意义私有 。在给 属性、方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到

  8. 使用 类名 () 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间。重写 new 方法 一定要 return super().new(cls)

    # 单例模式
    class MusicPlayer(object):
        # 定义类属性记录单例对象引用
        instance = None
        def __new__(cls, *args, **kwargs):
            # 1. 判断类属性是否已经被赋值
            if cls.instance is None:
                cls.instance = super().__new__(cls)
            # 2. 返回类属性的单例引用
            return cls.instance
    
  9. 如果想让__init__方法也执行一次需要添加个类变量init_flag

  10. 实例方法、类方法和静态方法

    • 实例方法第一个参数是self
    • 类方法使用@classmethod修饰符
    • 静态方法使用装饰器@staticmethod。 既可以使用类也可以使用实例来调用静态方法
  11. 继承class Child(Parent):

  12. super().父类方法调用父类方法

  13. 多继承继承``class Child(Father, Mother):

  14. Python属性的获取 存在一个 向上查找机制。首先在对象内部属性中查找,如果没有再查找类属性

  15. 模块是 Python 程序架构的一个核心概念。每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块

  16. 模块导入

    import 模块名1, 模块名2 
    import 模块名1
    import 模块名2 
    import 模块名1 as 模块别名
    from 模块名1 import 工具名(全局变量、函数、类)
    from 模块名1 import * #从模块导入所有工具。这种方式不推荐,因为函数重名并没有任何的提示,出现问题不好排查
    
  17. 如果 两个模块,存在 同名的函数,那么 后导入模块的函数,会 覆盖掉先导入的函数

  18. Python 中每一个模块都有一个内置属性 __file__ 可以 查看模块完整路径

  19. __name__ 属性可以做到,测试模块的代码 只在测试情况下被运行,而在 被导入时不会被执行!便于单文件测试

    • 如果 是被其他文件导入的__name__ 就是 模块名
    • 如果 是当前执行的程序 __name__main
    # 导入模块
    # 定义全局变量
    # 定义类
    # 定义函数
    
    # 在代码的最下方
    def main():
        # ...
        pass
    # 根据 __name__ 判断是否执行下方代码。
    if __name__ == "__main__":
        main()
    
  20. 可以在目录下创建__init__.py。import 包名,就可以导入里边所有模块

    # 从 当前目录 导入 模块列表
    from . import send_message
    from . import receive_message
    
  21. 如果希望自己开发的模块,分享 给其他人,可以按照以下步骤操作

    • 制作发布压缩包步骤
    1. 创建 setup.py
    from distutils.core import setup
    setup(name="hm_message",  # 包名
          version="1.0",  # 版本
          description="itheima's 发送和接收消息模块",  # 描述信息
          long_description="完整的发送和接收消息模块",  # 完整描述信息
          author="itheima",  # 作者
          author_email="itheima@itheima.com",  # 作者邮箱
          url="www.itheima.com",  # 主页
          py_modules=["hm_message.send_message",
                      "hm_message.receive_message"])
    

    有关字典参数的详细信息,可以参阅官方网站:

    https://docs.python.org/2/distutils/apiref.html

    1. 构建模块
    $ python3 setup.py build
    
    1. 生成发布压缩包
    $ python3 setup.py sdist
    

    注意:要制作哪个版本的模块,就使用哪个版本的解释器执行!

* 安装模块

```bash
$ tar -zxvf hm_message-1.0.tar.gz 
$ sudo python3 setup.py install
```

* 卸载模块

直接从安装目录下,把安装模块的 **目录** 删除就可以

```bash
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*
```
  1. pip 安装/卸载第三方模块

    # 将模块安装到 Python 2.x 环境
    $ sudo pip install pygame
    $ sudo pip uninstall pygame
    
    # 将模块安装到 Python 3.x 环境
    $ sudo pip3 install pygame
    $ sudo pip3 uninstall pygame
    
  2. 捕获异常

    try:
        num = int(input("请输入整数:"))
        result = 8 / num
        print(result)
    except ValueError:
        print("请输入正确的整数")
    except ZeroDivisionError:
        print("除 0 错误")
    except Exception as result:
        print("未知错误 %s" % result)
    else:
        # 没有异常才会执行的代码
        pass
    finally:
        # 无论是否有异常,都会执行的代码
        print("无论是否有异常,都会执行的代码")
    
  3. 异常的传递 —— 当 函数 / 方法 执行 出现异常,会 将异常传递 给 函数 / 方法 的 调用一方

    如果 传递到主程序,仍然 没有异常处理,程序才会被终止

  4. 手动抛出异常

    ex = Exception("密码长度不够")
    raise ex
    
  5. eval() —— 将字符串 当成 有效的表达式 来求值 并 返回计算结果

  6. 在开发时千万不要使用 eval 直接转换用户 input 的结果

  7. 使用import导入Python模块的时候,默认调用的是__import__()函数。直接使用该函数的情况很少见,一般用于动态加载模块。

    __import__(name, globals, locals, fromlist, level)只有name是必选参数,其他都是可选参数,一般情况下直接使用name参数即可。

  8. viVisual interface 的简称,是 Linux最经典 的文本编辑器

    vi 的核心设计思想 —— 让程序员的手指始终保持在键盘的核心区域,就能完成所有的编辑操作

  9. vim = vi improved

    vim 是从 vi 发展出来的一个文本编辑器,支持 代码补全编译错误跳转 等方便编程的功能特别丰富,在程序员中被广泛使用

  10. 如果vi是软连接,通过命令 ls -l 最后一列就是软连接的原始地址

    $ which vi
    $ ls -l /usr/bin/vi
    
  11. 打开文件并定位到行

    $ vi 文件名 +行数
    # 如果只带上 + 而不指定行号,会直接定位到文件末尾
    
  12. vim常用快捷键 https://www.zrahh.com/archives/260.html

  13. shell 俗称壳,c 语言编写的命令解析器程序,是用户使用 linux 的桥梁。Linux/Unix 提供了很多种 Shell。常用的 shell 有这么几种,sh、bash、csh 等。可以通过以下命令,查看系统有几种 shell:

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

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,708评论 0 8
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,688评论 0 10
  • 5Python集合容器 数据结构数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。 线性数据结构...
    清清子衿木子水心阅读 1,466评论 0 1
  • Python史上最全开发总结(转自静熙老师哈哈哈) 两本不错的书: 《Python参考手册》:对Python各个标...
    春风在抱阅读 752评论 1 4
  • evernote 在时间管理里,可以把这个作为一个需要记录的,可能要分享的,收藏灵感与想法的个人数据库。 合适场景...
    木头在燃烧阅读 621评论 0 0