day05-总结和考试

1.代码规范

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

1.1 名称

在python开发过程中会创建文件夹/文件/变量等,这些在命名有一些潜规则

  • 文件夹,小写&小写下划线连接,例如:commandsdata_utils
  • 文件,小写&小写下划线连接,例如:page.pydb_convert.py
  • 变量
    全局变量,大写&大写下划线连接,例如:NAME = "武沛齐"BASE_NAME = 18
    局部变量,小写&小写下划线连接,例如:data = [11,22,33user_parent_id = 9等。

1.2 注释

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

  • 文件注释(在文件夹下创建一个__int__.py)
"""
这个文件
.....
"""
  • 代码注释
name = "alex"	# 名字叫alex
name = "alex"
"""
xxxx
"""

1.3 todo

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

1.4 条件嵌套

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

1.5 简单逻辑先处理

参考前一天的最后一道练习题

1.6 循环

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

1.7 变量和值

代码需要格式化

2.知识补充

2.1 pass

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

2.2 is比较

is==的区别是什么?

  • ==,用于比较两个值是否相等。
  • is,用于表示内存地址是否一致。
v1 = []
v2 = []
print(v1 == v2)     # True,两个值相当
print(v1 is v2)     # False,不属于同一块内存

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

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

2.3 位运算

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

  • &,与
a = 60
b = 13
print(a & b)  # 12
  • |,或
a = 60
b = 13
print(a | b)  # 61
  • ^,异或
a = 60
b = 13
print(a ^ b)  # 49
  • ~,取反
a = 60
print(~a)   # -61
  • <<,左移动
a = 60
print(a << 2)   # 240
  • ,右移动

a = 60
print(a >> 2)   # 15

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

  • 计算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
print(v1 >> 1)		# 5

第一阶段考试题(答案)

  1. 简述解释型语言和编译型语言的区别。

    编译器和解释器的作用是将各编程语言的代码进行翻译,从而使得计算机能够识别并执行。
    编译器,全文翻译,将代码编译成`临时文件`,再执行临时文件。
    解释器,实时翻译,对代码实行边解释边执行。
    
  2. 罗列你听说过的编程语言。

    Java、C、C++、PHP、JavaScript、C#、Golang
    
  3. 简述位和字节的关系?

    1字节等于8位
    
  4. 简述你理解的 ascii、unicode、utf-8、gbk 编码。

    ascii编码、unicode字符集、utf-8编码、gbk编码本质上都是字符与二进制的关系。
    - ascii,只有256种对照关系,只包含英文、符号等。
    - unicode,万国码,包含了全球所有文字和二进制之间的一个对应关系。(ucs2或ucs4)
    - utf-8,对unicode字符集的码位进行压缩处理,间接也维护了字符和二进制的对照表。
    - gbk,包含中国、日本韩国等亚洲国家的文字和二进制的对照表。
    
  5. py2和py3默认解释器编码分别是什么?如何在代码中修改解释器的编码?

    py2:ascii
    py3:utf-8
    
    在文件的顶部通过设置: # -*- coding:编码 -*- 实现修改。
    
  6. pass的作用?

    pass相当于空行,程序啥都不做。 用于保持语法的完整性。
    
  7. is和==的区别?

    is,比较内存地址是否一致。
    ==,比较值是否相等。
    
  8. 列举你了解的Python2和Python3的区别。

    - 默认解释器编码
    - 整型和长整形
    - 地板除取整、取小数
    - 字典的keys()/values()/items() 获取的值不同。
    - py2,字典无序;py3.6+ 字典有序。
    
  9. 变量名的命名规范有哪些?

    三条规范(必须遵循,否则定义变量会报错)
      - 变量名只能由 字母、数字、下划线 组成。
      - 变量名不能以数字开头。
      - 变量名不能是Python内置关键字
    二条建议(遵循可以显得更加专业,不遵循也可以正常运行不报错)
    	- 下划线命名法,多个单词表示的变量名用下划线连接(均小写)
    	- 见名知意,通过阅读变量名就能知道此变量的含义。
    
  10. 都有那些值转换为布尔值时为False?

    0
    ""
    [] or list()
    () or tuple()
    set()
    None
    {} or dict()
    
  11. 简述如下三个变量的区别。

    v1 = (1)    # 整型 1
    v2 = (1,)   # 元组
    v3 = 1      # 整型 1
    
  12. 你所学的数据类型中哪些是可变的类型?

    list
    set
    dict
    
  13. 你所学的数据类型中哪些是可哈希的类型?

    int
    bool
    float
    str
    tuple
    
  14. 你所学的数据类型(容器)中哪些是有序的?

    list
    tuple
    dict(py3.6之后)
    
  15. 列举你能记得的如下数据类型的方法(独有功能)。

    • str

      strip
      split
      join
      startswith
      endswith
      upper
      lower
      ...
      
    • list

      append
      insert
      remove
      extend
      sort
      reverse
      ...
      
    • dict

      get
      keys
      values
      items
      setdefault
      update
      ...
      
  16. 请将字符 name = "wupeiqi" 翻转。

    data = name[::-1]
    print(data)
    
  17. 进制之间如何进行转换?

    - 十进制转其他:bin、oct、hex
    - 其他进制转十进制:int("其他进制",base=2或8或16)
    
  18. 循环过程中 break和continue的作用是什么?

    break,终止所有循环。
    continue,停止当前循环开始下次循环。
    
  19. 看代码写结果

    v1 = 1 or 9 and 88 or [11,22] and (1,2,3)
    
    v2 = 1>5 or "alex" and {"K1":"v1"} or 888
    
    print(v1,v2) # 1    {'K1': 'v1'}
    
  20. 看代码写结果

     info = [ 
         {'k1':(1),'k2':{'k9':'luffy','k10':'武沛齐'}}, 
         (11,22,33,44),
         {199,2,3,4,5},
         True, 
         ['李杰','alex', { 'extra': ("alex",[18,20],'eric') } ]
    ]
    
    • 利用索引获取 "luffy"

      info[0]["k2"]["k9"]
      
    • 利用索引获取 44

      info[1][-1]
      
    • 删除k10对应的键值对

      del info[0]['k2']['k10']
      
    • { 'extra': ("alex",[18,20],'eric') } 字典中添加一个键值对 "name":"武沛齐"

      info[-1][2]["name"] = "武沛齐"
      
    • 在集合{199,2,3,4,5}中添加一个 "北京"

      info[2].add("北京")
      
    • 将列表中的True修改为 "真"

      info[3] = "真"
      
    • 在列表 [18,20]的第0个索引位置插入 666

      info[-1][-1]["extra"][1].insert(0,666)
      
  21. 判断下面的代码是否正确?正确的话则写出结果,否则标明错误。

    v1 = (11,22,33)									# 正确 (11,22,33)
    v2 = (11)										# 正确 11
    v3 = {11,2,33}									# 正确 {11,2,33}
    v4 = {11,2,("alex","eric"),33}					# 正确 {11,2,("alex","eric"),33}
    v5 = {11,2,("alex",{"北京","上海"},"eric"),33}	 # 错误
    
  22. 看代码写结果

    v1 = [11,22,33]
    v2 = [11,22,33]
    v1.append(666)
    
    print(v1)  # [11,22,33,666]
    print(v2)  # [11,22,33]
    
  23. 看代码写结果

    v1 = [11,22,33]
    v2 = v1
    v1.append(666)
    
    print(v1) # [11,22,33,666]
    print(v2) # [11,22,33,666]
    
  24. 看代码写结果

    v1 = [1,2,3,4,5]
    v2 = [v1,v1,v1]
    
    v2[1][0] = 111
    v2[2][1] = 222
    
    print(v1) # [111,222,3,4,5]
    print(v2) # [[111,222,3,4,5],[111,222,3,4,5],[111,222,3,4,5]]
    
  25. 写代码实现,循环提示用户输入内容(Q或q终止),并将内容用 "_" 连接起来。

    data_list = []
    while True:
        text = input("请输入(Q/q退出):")
        if text.upper() == "Q":
            break
        data_list.append(text)
    
    result = "_".join(data_list)
    print(result)
    
  26. 写代码实现,将IP转换为整数。

    如 10.3.9.12 转换规则为:
    10 00001010
    3 00000011
    9 00001001
    12 00001100
    再将以上二进制拼接起来,然后再进行一次翻转。

    最终将翻转之后的二进制转换为整型。

    ip = "10.3.9.12"
    
    data_list = []
    num_list = ip.split(".")
    for num in num_list:
        item = bin(int(num))[2:].zfill(8)
        data_list.append(item)
    
    reverse_data = "".join(data_list)[::-1]
    result = int(reverse_data, base=2)
    print(result)
    
  27. 写代码实现,车牌的区域划分。

    car_list = ['鲁A32444', '沪B12333', '京B8989M', '京C49678', '黑C46555', '晋B25041', '沪C34567']
    
    # 根据以上代码获取各省车牌数量,例如:info = {"沪":2,"京":2 ...}
    
    car_list = ['鲁A32444', '沪B12333', '京B8989M', '京C49678', '黑C46555', '晋B25041', '沪C34567']
    
    info = {}
    
    for item in car_list:
        city = item[0]
        if city in info:
            info[city] = info[city] + 1
        else:
            info[city] = 1
    
    print(info)
    
    car_list = ['鲁A32444', '鲁B12333', '京B8989M', '京C49678', '黑C46555', '晋B25041', '沪C34567']
    
    info = {}
    for item in car_list:
        city = item[0]
        num = info.get(city, 0)
        info[city] = num + 1
    print(info)
    
  28. 写代码实现,数据格式化处理。

    text = """id,name,age,phone,job
    1,alex,22,13651054608,IT 
    2,wusir,23,13304320533,Tearcher
    3,老男孩,18,1333235322,IT"""
    
    # 将上述数据处理为如下格式的结果:
    #    info = [  {'id':'1','name':'alex','age':'22','phone':'13651054608','job':'IT'},.... ..  ]
    
    # 提示:text的内容是根据 \n 分割(\n表示回车换行)。
    
    text = """id,name,age,phone,job
    1,alex,22,13651054608,IT 
    2,wusir,23,13304320533,Tearcher
    3,老男孩,18,1333235322,IT"""
    
    data_list = text.split("\n") # ["id,name,age,phone,job","1,alex,22,13651054608,IT"... ]
    header_list = data_list[0].split(",") # ["id","name","age"... ]
    info = []
    for index in range(1, len(data_list)):
        item = {}
        row = data_list[index] # 1,alex,22,13651054608,IT 
        row_item_list = row.split(",") # ["1","alex","22",...]
        for i in range(len(row_item_list)):
            item[header_list[i]] = row_item_list[i]
        info.append(item)
    print(info)
    
  29. 写代码实现 累乘计算器。

    content = input("请输入内容:") # 用户可能输入 5*9*99.... 或 5* 9 * 10 * 99 或 5 * 9 * 99... (不用考虑非数字的情况)
    
    # 补充代码实现
    result = 1
    num_list = content.split("*") # ["5","9","99"]
    for num in num_list:
        # result *= int(num)
        result = result * int(num)
    
    print(result)
    
  30. 使用for循环实现输出 9*9 乘法表

    1*1
    2*1 2*2
    3*1 3*2 3*3
    4*1 4*2 4*3 4*4
    5*1 5*2 5*3 5*4 5*5
    6*1 6*2 6*3 6*4 6*5 6*6
    7*1 7*2 7*3 7*4 7*5 7*6 7*7
    8*1 8*2 8*3 8*4 8*5 8*6 8*7 8*8
    9*1 9*2 9*3 9*4 9*5 9*6 9*7 9*8 9*9
    
    
    1*1 
    1*2 2*2 
    1*3 2*3 3*3 
    1*4 2*4 3*4 4*4 
    1*5 2*5 3*5 4*5 5*5 
    1*6 2*6 3*6 4*6 5*6 6*6 
    1*7 2*7 3*7 4*7 5*7 6*7 7*7 
    1*8 2*8 3*8 4*8 5*8 6*8 7*8 8*8 
    1*9 2*9 3*9 4*9 5*9 6*9 7*9 8*9 9*9 
    
    print("666",end=" ")
    print("999",end=" ")
    666 999 
    
    for i in range(10):
        # 0,1,2,3,4,5,6,7,8
        for j in range(i): # []  [0] [0,1] [0,1,2]
            # 0,1
    
    for i in range(1, 10):
        # 1 2 3 4 5 6 7 8 9
        for j in range(1, i + 1): # [1]  [1,2]  [1,2,3]  [1,2,3,4] [1,2,3,4,5] ... [1,2,3,4...9 ]
            # j * i
            # 1 * 1
            # 1 * 2  2 * 2
            # 1 * 3 2 * 2
            text = "{}*{}".format(j, i)
            print(text, end=" ")
        print("")
    
  31. 补充代码实现《棋牌游戏11点》

    需求:

    • 生成一副扑克牌(自己设计扑克牌的结构,小王和大王可以分别用14、15表示 )

    • 3个玩家

      user_list = ["alex","武沛齐","李路飞"]
      
    • 发牌规则

      • 默认先给用户发一张牌,其中 J、Q、K、小王、大王代表的值为0.5,其他就是则就是当前的牌面值。
      • 用户根据自己的情况判断是否继续要牌。
        • 要,则再给他发一张。
        • 不要,则开始给下个玩家发牌。
      • 如果用户手中的所有牌相加大于11,则表示爆了,此人的分数为0,并且自动开始给下个人发牌。
    • 最终计算并获得每个玩家的分值,例如:

      result = {
          "alex":8,
          "武沛齐":9,
          "李路飞":0
      }
      

    必备技术点:随机抽排

    import random
    
    total_poke_list = [("红桃", 1), ("黑桃", 2), ("大王", 15), ("小王", 14)]
    
    # 随机生成一个数,当做索引。
    index = random.randint(0, len(total_poke_list) - 1)
    # 获取牌
    print("抽到的牌为:", total_poke_list[index])
    # 踢除这张牌
    data = total_poke_list.pop(index) # ("红桃", 1)
    
    print("抽完之后,剩下的牌为:", total_poke_list)
    

    代码示例:(请补充实现)

    import random
    
    result = {}
    
    user_list = ["alex", "武沛齐", "李路飞"]
    
    # 1. 生成一副扑克牌
    total_poke_list = [ ("小王",14),("大王",15) ]
    color_list = ["红桃", "黑桃", "方片", "梅花"]
    num_list = []
    for num in range(1, 14):
        num_list.append(num)
    for color in color_list:
        for num in num_list:
            item = (color, num,)
            total_poke_list.append(item)
    
    # 2. 发牌 -> ["alex", "武沛齐", "李路飞"]
    for user in user_list:
        # 给用户发第一张牌
        score = 0
        index = random.randint(0, len(total_poke_list) - 1)
        poke = total_poke_list.pop(index) # ("花色",值)
        # JQK表示 0.5 点
        value = poke[1]
        if poke[1] > 10:
            value = 0.5 
        score += value
        print("给{}发的牌:{}{},此刻所有牌面值总和:{}".format(user, poke[0], poke[1], score))
        
        # 用户选择是否继续要
        while True:
            choice = input("是否继续要牌(Y/N)?")
            choice = choice.upper()
    
            # 用户输入的不是Y/N/y/n
            if choice not in {"Y", "N"}:
                print("输入错误,请重新输入。")
                continue
    
            # 用户输入N,不继续要牌了
            if choice == "N":
                print("{}不要拍了".format(user))
                break
    
            # 继续要拍(再随机抽取一张)
            index = random.randint(0, len(total_poke_list) - 1)
            poke = total_poke_list.pop(index)
            value = poke[1]
            if poke[1] > 10:
                value = 0.5
            score += value
            
            print("给{}发的牌:{}{},此刻所有牌面值总和:{}".format(user, poke[0], poke[1], score))
    
            # 大于11点,则用户爆了且分值变为0
            if score > 11:
                print("用户{}爆了".format(user))
                score = 0
                break
    
        result[user] = score
    
    print(result)
    
posted @ 2024-03-25 19:32  死不悔改奇男子  阅读(50)  评论(0编辑  收藏  举报