第14篇:阶段总结

学习目标:对Python基础第一阶段的知识点进行总结,以更好的复习和理解此阶段的相关知识。

本节概要:

  • 代码规范
  • 知识补充
  • 阶段总结
  • 考试题

1. 代码规范

写代码是有规范的,不只是实现功能而已。

1.1 名称

在Python开发过程中会创建文件夹/文件/变量等,这些在命名有一些潜规则(编写代码时也要注意PEP8规范)

  • 文件夹,小写&小写下划线连接,例如:commands、data_utils等。
  • 文件,小写&小写下划线连接,例如:page.py、data_convert.py等。
  • 变量
    • 全局变量。大写&大写下划线连接,例如:Name = "张亚飞"BASE_DIR = 'python'
    • 局部变量,小写&小写下划线连接,例如:data =[11,22,33]user_parent_id = 9等。

PEP8规范:https://www.python.org/dev/peps/pep-0008

1.2 注释

写代码注释是非常基础并且有用的技能,方便以后对代码进行维护和理解。

  • 文件夹

    文件夹注释

  • 文件注释

    """
    这个文件主要为项目提供工具和转换的功能,除此之外还有...
    例如:
        ...
        ...
        ...
    """

    文件注释

  • 代码注释

    name = 'Michael'
    # 在名字后面加一个你真棒
    data = name + 'nzb'
    print(data)
    name = 'Michael'
    """
    在名字后面加一个你真棒,内部实现机制是:
        1. xxx
        2. xxx
        3. xxx
    """ 
    data = name + 'nzb'
    print(data)

1.3 todo

基于注释可以实现todo注释的效果,例如:

todo示例

1.4 条件嵌套

以后写条件语句要想办法减少嵌套的层级(最好不要超过3层)。

多层条件嵌套

1.5 简单逻辑先处理

  • 示例1:

    goods = [
        {"name": "电脑", "price": 1999},
        {"name": "鼠标", "price": 10},
        {"name": "游艇", "price": 20},
        {"name": "房子", "price": 998}
    ]
    for index in range(len(goods)):
        item = goods[index]
        print(index + 1, item['name'], item['price'])
    
    while True:
        num = input("请输入要选择的商品序号(Q/q):")  # "1"
        if num.upper() == "Q":
            break
        if num.isdecimal():
            num = int(num)
            if 0 < num < 5:
                target_index = num - 1
                choice_item = goods[target_index]
                print(choice_item["name"], choice_item['price'])
            else:
                print("序号范围选择错误")
        else:
            print("用户输入的序号格式错误")

    示例2:

    goods = [
        {"name": "电脑", "price": 1999},
        {"name": "鼠标", "price": 10},
        {"name": "游艇", "price": 20},
        {"name": "房子", "price": 998}
    ]
    for index in range(len(goods)):
        item = goods[index]
        print(index + 1, item['name'], item['price'])
    
    while True:
        num = input("请输入要选择的商品序号(Q/q):")  # "1"
        if num.upper() == "Q":
            break
        if not num.isdecimal():
            print("用输入的格式错误")
            break
        num = int(num)
    
        if num > 4 or num < 0:
            print("范围选择错误")
            break
        target_index = num - 1
        choice_item = goods[target_index]
        print(choice_item["name"], choice_item['price'])

1.6 循环

尽量少循环多干事,提高代码效率

key_list = []
value_list = []
info = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
for key, value in info.items():
    key_list.append(key)
    value_list.append(value)
info = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}

key_list = list(info.keys())
value_list = list(info.values())

1.7 变量和值

# 推荐
name = '张亚飞'
age = 15
# 推荐
name='张亚飞'
age=15

可以基于Pycharm的格式化工具来实现自动处理。

python代码规范:PEP8规范 代码洁癖

2. 知识补充

2.1 pass

一般Python的代码块是基于:缩进来实现的,Python中规定代码块中必须要有代码才算完整,在没有代码的情况下为了保证语法的完整性可以用pass代码,例如:

if 条件:
    pass
else:
    pass
for i in range(xxx):
    pass

2.2 is比较

is==的区别是什么?

  • ==,用于比较两个值是否相等。
  • is,用户表示内存地址是否一致。
# 示例1
v1 = []
v2 = []

print(v1 == v2)  # True, 两个值相当
print(v1 is v2)  # False, 不属于同一块内存

# 示例3
v1 = []
v2 = v1

print(v1 == v2)  # True, 两个值相当
print(v1 is v2)  # True, 属于同一块内存

# 示例3
v1 = None
v2 = None
print(v1 == v2)  # True, 两个值相当
print(v1 is v2)  # True, 属于同一块内存

2.3 None

在 Python 中,有一个特殊的常量 None(N 必须大写),表示空值。这里的空值并不代表空对象,即 None 和0、空列表、空字符串不同,相当于其他语言中 null作用一样None不支持任何运算也没有任何内建方法

  • None和任何对象比较返回值都是False
print(None == [])  # False
print(None == "")  # False
print(None is [])  # False
print(None is "")  # False
  • None有自己的数据类型NontType,但是不能创建其他NoneType对象(只有一个值None)
print(type(None))  # <class 'NoneType'>

​ 我们可以使用 type() 函数查看它的类型,可以看到,它属于 NoneType 类型。需要注意的是,None 是 NoneType 数据类型的唯一值(其他编程语言可能称这个值为 null、nil 或 undefined),也就是说,我们不能再创建其它 NoneType 类型的变量,但是可以将 None 赋值给任何变量。如果希望变量中存储的东西不与任何其它值混淆,就可以使用 None。

none = NoneType()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'NoneType' is not defined
  • 在一定程度上可以帮助我们去节省内存
v1 = None
v2 = []
v3 = ()
v4 = {}
v5 = set()

from sys import getsizeof

print(getsizeof(v1))  # 16 单位为 B 字节
print(getsizeof(v2))  # 64
print(getsizeof(v3))  # 48
print(getsizeof(v4))  # 240
print(getsizeof(v5))  # 224

判断以下哪种写法更节省内存

v1 = None
v2 = None
..
v1 = [11,22,33,44]
v2 = [111,22,43]
v3 = []
v4 = []
...
v3 = [11,22,33,44]
v4 = [111,22,43]

注意:暂不要考虑Python内部的缓存和驻留机制。

目前所有转换为布尔值为False的值有:

0
""
[] or list()
() or tuple()
{} or dict()
set()
None
if None:
    pass
  • None 常用于 assert、判断以及函数无返回值的情况

    举个例子,在前面章节中我们一直使用 print() 函数输出数据,其实该函数的返回值就是 None。因为它的功能是在屏幕上显示文本,根本不需要返回任何值,所以 print() 就返回 None。

print(None == print('hello'))  # True

另外,对于所有没有 return 语句的函数定义,Python 都会在末尾加上 return None,使用不带值的 return 语句(也就是只有 return 关键字本身),那么就返回 None。

  • None比较时用is==的区别?

因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。

a = None
b = None
print(a == b)  # True
print(a is b)  # True

is None是判断两个对象在内存中的地址是否一致,== None背后调用的是eq,而eq可以被重载,下面是一个 is not None但 == None的例子

class Obj:
    def __eq__(self, other):
        return True

obj = Obj()
print(obj == None)  # True
print(obj is None)  # False

2.4 位运算

计算机底层本质上都是二进制,我们平时在计算机中做的很多操作底层都会转换为二进制的操作,俄日运算就是对二级制的操作,

  • &,与(都为1)

    a = 60        # 60 = 0011 1100
    b = 13        # 13 = 0000 1101
    
    c = a & b    # 12 = 0000 1100
  • |,或(只要有一个为1)

    a = 60        # 60 = 0011 1100
    b = 13        # 13 = 0000 1101
    
    c = a | b    # 61 = 0011 1101
  • ^,异或(值不同)

    a = 60        # 60 = 0011 1100
    b = 13        # 13 = 0000 1101
    
    c = a ^ b    # 49 = 0011 0001
  • ~,取反

    a = 60        #  60 = 0011 1100
    c = ~a        # -61 = 1100 0011
  • <<,左移动

    a = 60        #  60 = 0011 1100
    c = a << 2;  # 240 = 1111 0000
  • >>,右移动

    a = 60        # 60 = 0011 1100
    c = a >> 2;  # 15 = 0000 1111

平时在开发中,二进制的位运算几乎很少使用,在计算机底层或网络协议底层用的会比较多,例如:

  • 计算 2 ** n

    2 ** 0     1 << 0    1        1
    2 ** 1     1 << 1    10        2
    2 ** 2     1 << 2    100        4
    2 ** 3     1 << 3    1000    8
    ...
  • 计算一个数的一半

    v1 = 10 >> 1
    print(v1)   # 值为5
    
    v2 = 20 >> 1
    print(v2)  # 值为10
  • 网络传输数据,文件太大还未传完(websocket源码为例)

        第一个字节         第二个字节   ...         
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-------+-+-------------+-------------------------------+
    |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
    |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
    |N|V|V|V|       |S|             |   (if payload len==126/127)   |
    | |1|2|3|       |K|             |                               |
    +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
    FIN位置是0,表示这是一部分数据,后续还有数据。
    FIN位置是1,表示这是最后数据,已发送完毕。
    # 例如:接收到第一个字节的值为245(11110101),让v的二进制和1000 0000做 & 与运算
    v = 245  # 245 11110101
            # 128 10000000
    data = v & 128
    if data == 0:
        print('还有数据')
    else:
        print('已完毕')

3. 总结

第一阶段-思维导图

4. 考试题

考试题的目的是让大家对自己近期知识点学习练习以及自测,请大家务必【独立】完成(切勿看笔记 & 切勿网上搜索)。

  • 第一步:自己独立完成(闭卷)
  • 第二步:做完之后,翻看自己笔记去修改和更正。
  • 第三步:觉得自己做的没问题了,最后再去看考试题的参考答案。

文章作者: 张亚飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张亚飞 !
评论
 上一篇
第15篇:初识函数 第15篇:初识函数
学习目标:掌握函数的基本知识点 本节导语:函数应该做一件事。做好这件事。只能做这一件事 何为函数在讲解本节课的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。 你可能已经想到了,这个问题其实等同于将8个苹果分成四组且每
2020-12-19
下一篇 
第13篇:字典集合最佳练习 第13篇:字典集合最佳练习
字典集合最佳练习练习:统计句子词频 给出一个字符串,在程序中赋初值为一个句子,例如“To improve is to change;to be perfect is to change often.”, 需要:计算句子中各字符出现的频数(通
2020-12-18
  目录