zoukankan      html  css  js  c++  java
  • Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

      Python全栈开发记录只为记录全栈开发学习过程中一些和重要的知识点,还有问题及课后题目,以供自己和他人共同查看。(该篇代码行数大约:300行)

    知识点1:优先级:not>and

        短路原则:and:如果第一个条件的结论为假,那么 and 前后两个条件组成的表达式计算结果一定为假,后面的条件计算机不会进行计算

             or:如果第一个条件的结论为真,那么or 前后两个条件组成的表达式计算结果一定为真,后面的条件计算机不会进行计算

    知识点2:python区分大小写,常量需全部字母大写(默认这样写)

        python换行符说明:Windows是' ',Linux是' ',在Python 3,可以通过open函数的newline参数来控制Universal new line mode:读取时候,不指定newline,则默认开启Universal new line mode,所有 , , or 被默认转换为 ;写入时,不指定newline,则换行符为各系统默认的换行符( , , or , ),指定为newline=' ',则都替换为 (相当于Universal new line mode);不论读或者写时,newline=''都表示不转换。

    知识点3:while...else...和for...else....:while循环中,只要循环正常完成,即中途没有break,那么就会 执行else语句,否则就不会,for循环跟while原理一样。

    知识点4:exit("退出啦")->程序退出,并提示“退出啦”。

    知识点5:python3已经不区分长整型和整型,python2区分,主要是长度(linux和windows也不一样,可以自己试一下)

    知识点6:python3列表切片:a=[1,2,3],a[1:10]就等同于a[1:]也就是说索引2之后本身就不存在了也不管了直接取到最后就行,但是不能a[10],会出现索引错误。

        a,b = [1,2] -> a=1,b=2

    知识点7:enumerate(sequence, [start=0]), 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

    知识点8:字典的键只能为不可变类型,值可以为任意值,字典键唯一,重复的键,取字典最后一个。

          不可变类型:整型、字符串、元组

          可变类型:列表、字典

    知识点9:字符串:a="12",b="tt",c="hh" -> '-'.join([a,b,c]) 结果就是"12-tt-hh",字符串通过join实现拼接,效率比+更快(试了简单的拼接,join快几百倍)。

       format格式化输出:a="hello world {name} {age}"  -> a.format(name="liu", age=18)或者a.format_map({"name":"liu", "age":18}),然后结果就是hello world liu 18。

    知识点10:关于python中编码的问题,先说python2的编码:

    python2文本字符默认编码是ASCII,python3中文本字符默认为unicode(py3在编码的同时会把数据变成byte类型,在解码的同时会把byte类型转成字符串),下图是从金角大王那里借鉴的,decode是解码,encode是编码,unicode是他们共同的联系(unicode向下兼容gbk),

     

    #coding=utf-8
    a = "我是中国人"
    #utf-8转换成gbk,正确写法,下面都是py2的写法
    utf8_to_unicode = a.decode("utf-8")  #将utf-8解码成unicode
    unicode_to_gbk = utf8_to_unicode.encode("gbk")  #将unicode编码成gbk
    
    print("unicode", utf8_to_unicode)
    print("gbk", unicode_to_gbk)
    
    
    #如果gbk装换成utf8,错误写法如下
    gbk_to_utf8 = unicode_to_gbk.encode("utf-8")
    #实际上python2自动帮你换成了,decode()不写表示默认用ASICC帮你解码
    unicode_to_gbk.decode().encode("utf-8")
    
    
    #gbk转换成utf-8,正确写法如下,必须先转成unicode先
    gbk_to_unicode = unicode_to_gbk.decode("gbk")   #将gbk解码成unicode
    unicode_to_utf8 = gbk_to_unicode.encode("utf-8")  #将unicode编码成utf-8
    
    print("unicode", gbk_to_unicode)
    print("utf-8", unicode_to_utf8)

    题目一:用户输入三个数字,输出三个数字中的最值/最小值

    # -*- coding:utf-8 -*-
    
    '''
    需求1:用户输入三个数字,输出三个数字中的最大值/最小值
    
    思路:以num1,num2,num3三个数为例
        1、三个数比较的话,先比较两个数,然后再拿这两个数跟第三个数进行比较
        2、
        if num1 >= num2:
            if num2 >= num3:
                print("最大值是:",num1,",最小值是:",num3)
            elif num1 >= num3:
                print("最大值是:",num1,",最小值是:",num2)
            else:
                print("最大值是:",num3,",最小值是:",num2)
        else:
            if num1 >= num3:
                print("最大值是:",num2,",最小值是:",num3)
            elif num2 >= num3:
                print("最大值是:",num2,",最小值是:",num1)
            else:
                print("最大值是:",num3,",最小值是:",num1)
    '''
    
    def compare_size():
        num1 = int(input("请输入第一个数字:"))
        num2 = int(input("请输入第二个数字:"))
        num3 = int(input("请输入第三个数字:"))
        if num1 >= num2:
            if num2 >= num3:
                print("最大值是:",num1,",最小值是:",num3)
            elif num1 >= num3:
                print("最大值是:",num1,",最小值是:",num2)
            else:
                print("最大值是:",num3,",最小值是:",num2)
        else:
            if num1 >= num3:
                print("最大值是:",num2,",最小值是:",num3)
            elif num2 >= num3:
                print("最大值是:",num2,",最小值是:",num1)
            else:
                print("最大值是:",num3,",最小值是:",num1)
    
    
    if __name__ == "__main__":
        compare_size()

    题目二:使用#号输出长方形,用户可以指定宽和高,如果宽为4,高为5,则输出4个横#和5个竖#的长方形
    # -*- coding:utf-8 -*-
    
    '''
    需求2:使用#号输出长方形,用户可以指定宽和高,如果宽为4,高为5,则输出4个横#和5个竖#的长方形
    
    思路:
        1、一般横竖这种可以通过循环嵌套来处理
        2、外层循环代表横,内层循环代表竖
    
    '''
    
    def print_rectangle():
        #接收用户输入
        rec_width = int(input("请输入宽:"))
        rec_height = int(input("请输入高:"))
        #外层循环输出高
        for height in range(rec_height):
            #内层循环输出宽的数量
            for width in range(rec_width):
                print("#",end="")
            #每行打完换行
            print()
    
    if __name__ == "__main__":
        print_rectangle()
    
    

    题目三:
    如何输出如下直角三角形,用户指定行数(上下反转试下)
    '''
    需求3:如何输出如下直角三角形,用户指定行数(上下反转试下)
    *
    **
    ***
    
    思路:
        1、外层循环代表横,内层循环代表竖(先确定这个框架)
        2、外层是行,那么也就是用户的输入,由于用户只输入了高,发现列是第一行一,第二行二,第N行N,所以可以不用内循环也可以
        3、上下反转的话,就是输出第一行是N,依次减一即可
    
    '''
    
    def print_triangle():
        # 接收用户输入
        tri_height = int(input("请输入三角形的高:"))
        # 外层循环输出高
        for height in range(1, tri_height+1):
            print("*"*height)
    
    def up_down_print_triangle():
        # 接收用户输入
        tri_height = int(input("请输入三角形的高:"))
        # 外层循环输出高
        for height in range(1, tri_height+1):
            print("*"*(tri_height+1-height))
    
    if __name__ == "__main__":
        #print_triangle()
        up_down_print_triangle()

    题目四:输出九九乘法表
    '''
    需求4:输出九九乘法表
    1*1=1
    1*2=2 2*2=4
    1*3=3 2*3=6 3*3=9
    ....
    
    思路:
        1、外层循环代表横,内层循环代表竖(先确定这个框架)
        2、然后找寻规律,发现总共九行,第一行一列,第N行N列
        3、x*y 左边x,x的值由1逐步增加至y  y的数值则为列的数值
    '''
    
    def print_99_multiply():
        #99乘法表的行、列数用变量表示
        nine_lines = 9
        nine_weight = 9
        #行的数量
        for line in range(1, nine_lines+1):
            #列的数量,由于列的数量跟行数量一致,所以是line+1
            for weight in range(1, line+1):
                print("%d*%d=%d"%(weight, line, (weight*line)),end="	") #	制表符是为了对齐
            print()
    
    if __name__ == "__main__":
        print_99_multiply()

      

    题目五:购物车小程序
    # -*- coding:utf-8 -*-
    # @__author__ : Loris
    # @Time : 2018/10/24 9:11
    
    '''
    需求5:购物车程序(不用字典)
    
    '''
    
    #初版
    def first_shopping_car():
        #商店的商品
        shops = ["iphoneX", "Book", "Computer", "Flower", "Tea"]
    
        #商品价格列表
        shop_prices = [12800, 100, 5000, 99, 35]
    
        #用户账户余额
        salary = 10000
    
        #用户购物车列表
        buy_shops = []
    
        while True:
            #欢迎用户进入购物页面,并且显示所有购物商品
            print('''
            商品列表:
                1、iphoneX    12800
                2、Book    100
                3、Computer    5000
                4、Flower    99
                5、Tea    35
            ''')
            shop_num = input("请您选择商品,退出请输入quit:")
    
            if shop_num == "quit":
                print("您已购买以下商品:")
                for shop in buy_shops:
                    shop_price_index = shops.index(shop)
                    print("%s   %d"%(shop, shop_prices[shop_price_index]))
                print("您的余额为:%d" %salary)
                print("欢迎下次光临!")
                break
            #当前商品的价格
            current_shop_price = shop_prices[int(shop_num)-1]
    
            #当前商品名称
            current_shop_name = shops[int(shop_num)-1]
    
            #用户选择后,用用户余额扣除商品的价格,当小于0时提示用户余额不足,并显示扣除之后的值
            if (salary-current_shop_price) >= 0:
                buy_shops.append(current_shop_name)
                salary = salary - current_shop_price
                print("已加入 %s 到您的购物车,当前你账户余额为%d"%(current_shop_name, salary))
            else:
                print("余额不足,%s"%(salary-current_shop_price))
    
    #第二个版本(优化版本)
    def second_shopping_car():
        #商品列表,这里就将商品和价格用元组表示
        shops_list = [
            ("iphoneX", 12800),
            ("Book", 100),
            ("Computer", 5000),
            ("Flower", 99),
             ("Tea", 35),
        ]
    
        #用户账户余额
        salary = 10000
    
        #用户购物车列表
        buy_shops = []
    
        while True:
            #展示所有商品信息
            for num, shop in enumerate(shops_list, 1):
                if num == 1:
                    print("序号".ljust(8)+"商品".ljust(10)+"价格".ljust(10))
                print(str(num).ljust(10)+shop[0].ljust(12)+str(shop[1]).ljust(10))
    
            #接收用户输入要购买的商品
            shop_num =  input("请您选择商品,退出请输入quit:")
    
            #判断输入是否合理
            if shop_num.isdigit():
                shop_num = int(shop_num)
                if shop_num>0 and shop_num<=len(shops_list):
                    #当前商品
                    current_shop = shops_list[shop_num-1]
    
                    #判断余额是否大于当前商品的价格,大于则加入购物车,小于则提示余额不足
                    if current_shop[1] <= salary:
                        salary -= current_shop[1] #减去商品的价格
                        #如果说购物车有商品则将商品拿出来依次判断
                        if len(buy_shops) != 0:
                            for buy_shop in buy_shops:
                                if current_shop[0] == buy_shop[0]:
                                     #当发现有同样商品时,商品数量加1,然后退出循环
                                    buy_shop[1] += 1
                                    break
                            #当循环完成后如果还是没有找到相同的商品,则额外添加商品,数量默认为1
                            else:
                                buy_shops.append([current_shop[0], 1])
                        #如果没商品就直接添加第一个
                        else:
                            buy_shops.append([current_shop[0], 1])  #将商品加入到购物车
                        print("您已将%s商品加入购物车,当前账户余额为%d"%(current_shop[0], salary))
                    else:
                        print("您当前余额不足,还剩%s元钱"%salary)
                else:
                    print("你输入的商品序号不存在,请重新输入!")
            elif shop_num == "quit":
                #在退出前展示已购买列表
                print("--------已购买商品列表如下--------")
                print("商品".ljust(8)+"数量".ljust(10))
                for buy_shop in buy_shops:
                    print(buy_shop[0].ljust(10)+str(buy_shop[1]).ljust(10))
    
                break
            else:
                print("你输入的内容有误,请重新输入!")
    
    if __name__ == "__main__":
        second_shopping_car()

    效果图如下:

     题目六:三级菜单

    # -*- coding:utf-8 -*-
    '''
    需求6:三级菜单
    要求:
        1、打印省、市、县三级菜单
        2、可返回上一级
        3、可随时退出程序
    
    思路:
        1、有几级菜单就需要几个while循环,这样才能不断选择
        2、退出标识位用不同变量表示
    '''
    
    #字典存放省、市、县
    menu_dict = {
        "广东省":{
            "深圳市":{
                "罗湖区":{},
                "福田区":{},
                "南山区":{}
            },
            "广州市":{
                "白云区":{},
                "天河区":{},
                "越秀区":{},
                "番禺区":{}
            },
            "东莞市":{
                "虎门镇":{},
                "樟木头":{},
                "常平镇":{},
                "大岭山":{}
            }
        },
        "湖南省":{
            "长沙市":{
                "雨花区":{},
                "岳麓区":{},
                "芙蓉区":{}
            },
            "株洲市":{
                "天元区":{},
                "沪松区":{}
            },
            "邵阳市":{
                "新邵县":{},
                "大祥区":{},
                "武冈":{},
                "隆回县":{}
            }
        }
    }
    
    #第一版(初级版本)
    #定义退出标识位
    # provice_flag = True   #一级菜单
    # city_flag = True      #二级菜单
    # area_flag = True      #三级菜单
    #
    # while provice_flag:
    #     # 打印一级菜单
    #     for provice in menu_dict:
    #         print(provice)
    #     #用户选择省
    #     provice_menu = input("please choice,b返回上一层,q则退出:").strip()
    #     #print(provice_menu)
    #     if provice_menu in menu_dict:
    #         # 用户选择后,就可以进入循环,用break就可以不用考虑
    #         city_flag = True
    #         while city_flag:
    #             #打印二级菜单(市)
    #             for city in menu_dict[provice_menu]:
    #                 print(city)
    #             #用户选择市
    #             city_menu = input("please choice,b返回上一层,q则退出:").strip()
    #             if city_menu in menu_dict[provice_menu]:
    #                 # 用户选择后,就可以进入循环,用break就可以不用考虑
    #                 area_flag = True
    #                 while area_flag:
    #                     #打印三级菜单(区)
    #                     for area in menu_dict[provice_menu][city_menu]:
    #                         print(area)
    #                     # 用户选择区
    #                     area_menu = input("please choice,b返回上一层,q则退出:").strip()
    #                     if area_menu in menu_dict[provice_menu][city_menu]:
    #                         print("已经是最后一层了,请返回!")
    #                     elif area_menu == "q":
    #                         area_flag = False
    #                         city_flag = False
    #                         provice_flag = False
    #                     elif area_menu == "b":
    #                         area_flag = False
    #                     else:
    #                         print("输入有误!")
    #             elif city_menu == "q":
    #                 city_flag = False
    #                 provice_flag = False
    #             elif city_menu == "b":
    #                 city_flag = False
    #             else:
    #                 print("输入有误!")
    #
    #     elif provice_menu == "q":
    #         provice_flag = False
    #     elif provice_menu == "b":
    #         provice_flag = False
    #     else:
    #         print("输入有误!")
    
    

    #第二版(优化版本) #退出的标识位 flag = True #通过变量存储变化的菜单栏 current_menu = menu_dict #刚开始就是一级菜单栏 #通过列表记录以往的父级菜单 menu_list = [] while flag: #打印菜单栏内容,跟current_menu有关 for menu in current_menu: print(menu) choice_menu = input("请选择,b返回上一层,q退出:") if choice_menu in current_menu: #将父级菜单加入列表 menu_list.append(current_menu) #变量存储子级菜单 current_menu = current_menu[choice_menu] if not current_menu: print("最后一层了") elif choice_menu == 'b': #如果列表记录无内容证明在第一层,所以就不需要执行返回上一层 if len(menu_list) == 0:continue current_menu = menu_list.pop() elif choice_menu == 'q': flag = False else: print("输入有误!")

    总结:第一篇主要用到的知识都是循环嵌套,虽然不难,但是这上面的题目都还是比较经典的,建议在做题的时候先看清楚需求然后明确思路,锻炼先理顺实现逻辑再去编程,这样会比较好,而且要写注释,变量名也需要有意义。

  • 相关阅读:
    微信小程序统一管理接口
    微信小程序购物车
    微信小程序表单的取值
    在VS Code中编写IAR项目
    【管理员已阻止你运行此应用】windows defender图标打叉,无法打开mmc.exe解决办法
    Eclipse普通java Project文件路径问题
    【线性表基础】基于线性表的简单算法【Java版】
    【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
    Java逆序输出整数
    Java打印实心、空心的三角形和菱形
  • 原文地址:https://www.cnblogs.com/leixiaobai/p/9828294.html
Copyright © 2011-2022 走看看