zoukankan      html  css  js  c++  java
  • 26 Mar 18 函数介绍

    一、上节课复习:

        什么是文件?

            文件是操作系统提供给应用程序操作硬盘的的一个虚拟单位,

            用于应用程序将数据永久保存

        文件的打开模式:

            t:text文本模式,读写文件是以字符串为单位,需要指定字符编码,

                t模式的局限性是只能读写文本文件

            b:bytes字节模式,读写文件都是以bytes为单位,不需要指定字符编码

               b模式的好处的是可以读写任意类型的文件

            f=open(r'aa.txt',mode='wb') #linux, mac系统中路径起点/表示一个文件夹

            f.write('你好'.encode('utf-8'))

            f.close()

        注意:

            t或b都不能单独使用

            必须与r、w、a模式组合使用

         强调:

            写文件换行符用

            读文件换行符也是

    二、作业讲解之三级菜单 (两种方法)

    menu = {
        '北京':{
            '海淀':{
                '五道口':{
                    'soho':{},
                    '网易':{},
                    'google':{}
                },
                '中关村':{
                    '爱奇艺':{},
                    '汽车之家':{},
                    'youku':{},
                },
                '上地':{
                    '百度':{},
                },
            },
            '昌平':{
                '沙河':{
                    '老男孩':{},
                    '北航':{},
                },
                '天通苑':{},
                '回龙观':{},
            },
            '朝阳':{},
            '东城':{},
        },
        '上海':{
            '闵行':{
                "人民广场":{
                    '炸鸡店':{}
                }
            },
            '闸北':{
                '火车战':{
                    '携程':{}
                }
            },
            '浦东':{},
        },
        '山东':{},
    }

    # 方法一:
    # tag=True
    # while tag:
    #     menu1=menu
    #     for key in menu1:
    #         print(key)
    #
    #     choice1=input('第一层>>: ').strip() # choice1='asdfkhsadjkfhsakdfja'
    #     if choice1 == 'b':break
    #     if choice1 == 'q':
    #         tag = False
    #         break
    #     if choice1 not in menu1:continue
    #
    #     while tag:
    #         menu2=menu1[choice1] #menu1['北京']
    #         for key in menu2:
    #             print(key)
    #
    #         choice2 = input('第二层>>: ').strip()
    #         if choice2 == 'b':break
    #         if choice2 == 'q':
    #             tag=False
    #             break
    #         if choice2 not in menu2:continue
    #
    #         while tag:
    #             menu3 = menu2[choice2]  #
    #             for key in menu3:
    #                 print(key)
    #
    #             choice3 = input('第三层>>: ').strip()  # choice3='五道口'
    #             if choice3 == 'b':break
    #             if choice3 == 'q':
    #                 tag=False
    #                 break
    #             if choice3 not in menu3: continue
    #
    #             while tag:
    #                 menu4 = menu3[choice3]  #
    #                 for key in menu4:
    #                     print(key)
    #
    #                 choice4 = input('第四层>>: ').strip()  # choice1='北京'
    #                 if choice4 == 'b':break
    #                 if choice4 == 'q':
    #                     tag=False
    #                     break
    #
    #                 if choice4 not in menu4: continue

    #方法二:

    #逻辑分析:
    #1、拿到当前层的菜单字典
    #2、循环打印字典的key
    #3、接收用户输入
    #4、进入下一层,需要先拿到下一次层的字典

    layers=[menu,]
    while True:
        if len(layers) == 0:break
       
    # 1、拿到当前层的菜单字典
       
    current_layer=layers[-1]
        # 2、循环打印字典的key
       
    for key  in current_layer:
            print(key)
        # 3、接收用户输入
       
    choice=input('>>: ').strip()
        if choice == 'q':break
        if
    choice == 'b':
            layers.pop(-1)
            continue
        if
    choice not in current_layer:continue
       
    # 4、进入下一层,需要先拿到下一次层的字典
       
    layers.append(current_layer[choice])

    三、作业讲解之购物车(常规,函数)

    import os

    product_list = [['Iphone7',5800],

                    ['Coffee',30],

                    ['疙瘩汤',10],

                    ['Python Book',99],

                    ['Bike',199],

                    ['ViVo X9',2499],

                    ]

    shopping_cart={}

    current_userinfo=[]

    db_file=r'db.txt'

    while True:

        print('''

        1 登陆

        2 注册

        3 购物

        ''')

        choice=input('>>: ').strip()

        if choice == '1':

            #1、登陆

            tag=True

            count=0

            while tag:

                if count == 3:

                    print('33[45m尝试次数过多,退出。。。33[0m')

                    break

                uname = input('用户名:').strip()

                pwd = input('密码:').strip()

                with open(db_file,'r',encoding='utf-8') as f:

                    for line in f:

                        line=line.strip(' ')

                        user_info=line.split(',')

                        uname_of_db=user_info[0]

                        pwd_of_db=user_info[1]

                        balance_of_db=int(user_info[2])

                        if uname == uname_of_db and pwd == pwd_of_db:

                            print('33[48m登陆成功33[0m')

                            # 登陆成功则将用户名和余额添加到列表

                            current_userinfo=[uname_of_db,balance_of_db]

                            print('用户信息为:',current_userinfo)

                            tag=False

                            break

                    else:

                        print('33[47m用户名或密码错误33[0m')

                        count+=1

        elif choice == '2':

            uname=input('请输入用户名:').strip()

            while True:

                pwd1=input('请输入密码:').strip()

                pwd2=input('再次确认密码:').strip()

                if pwd2 == pwd1:

                    break

                else:

                    print('33[39m两次输入密码不一致,请重新输入!!!33[0m')

            balance=input('请输入充值金额:').strip()

            with open(db_file,'a',encoding='utf-8') as f:

                f.write('%s,%s,%s ' %(uname,pwd1,balance))

        elif choice == '3':

            if len(current_userinfo) == 0:

                print('33[49m请先登陆...33[0m')

            else:

                #登陆成功后,开始购物

                uname_of_db=current_userinfo[0]

                balance_of_db=current_userinfo[1]

                print('尊敬的用户[%s] 您的余额为[%s],祝您购物愉快' %(

                    uname_of_db,

                    balance_of_db

                ))

                tag=True

                while tag:

                    for index,product in enumerate(product_list):

                        print(index,product)

                    choice=input('输入商品编号购物,输入q退出>>: ').strip()

                    if choice.isdigit():

                        choice=int(choice)

                        if choice < 0 or choice >= len(product_list):continue

                        pname=product_list[choice][0]

                        pprice=product_list[choice][1]

                        if balance_of_db > pprice:

                            if pname in shopping_cart: # 原来已经购买过

                                shopping_cart[pname]['count']+=1

                            else:

                                shopping_cart[pname]={'pprice':pprice,'count':1}

                            balance_of_db-=pprice # 扣钱

                            current_userinfo[1]=balance_of_db # 更新用户余额

                            print("Added product " + pname + " into shopping cart,33[42;1myour current33[0m balance " + str(balance_of_db))

                        else:

                            print("买不起,穷逼! 产品价格是{price},你还差{lack_price}".format(

                                price=pprice,

                                lack_price=(pprice - balance_of_db)

                            ))

                        print(shopping_cart)

                    elif choice == 'q':

                        print("""

                        ---------------------------------已购买商品列表--------

                        id          商品        数量         单价         总价

                        """)

                        total_cost=0

                        for i,key in enumerate(shopping_cart):

                            print('%22s%18s%18s%18s%18s' %(

                                i,

                                key,

                                shopping_cart[key]['count'],

                                shopping_cart[key]['pprice'],

                                shopping_cart[key]['pprice'] * shopping_cart[key]['count']

                            ))

                            total_cost+=shopping_cart[key]['pprice'] * shopping_cart[key]['count']

                        print("""

                        您的总花费为: %s

                        您的余额为: %s

                        ----------------------------end------------------------

                        """ %(total_cost,balance_of_db))

                        while tag:

                            inp=input('确认购买(yes/no?)>>: ').strip()

                            if inp not in ['Y','N','y','n','yes','no']:continue

                            if inp in ['Y','y','yes']:

                                # 将余额写入文件

                                src_file=db_file

                                dst_file=r'%s.swap' %db_file

                                with open(src_file,'r',encoding='utf-8') as read_f,

                                    open(dst_file,'w',encoding='utf-8') as write_f:

                                    for line in read_f:

                                        if line.startswith(uname_of_db):

                                            l=line.strip(' ').split(',')

                                            l[-1]=str(balance_of_db)

                                            line=','.join(l)+' '

                                        write_f.write(line)

                                os.remove(src_file)

                                os.rename(dst_file,src_file)

                                print('购买成功,请耐心等待发货')

                            shopping_cart={}

                            current_userinfo=[]

                            tag=False

                    else:

                        print('输入非法')

        else:

            print('33[33m非法操作33[0m']

    四、函数介绍

    为什么要有函数?什么是函数?

        a. 组织结构不清晰,可读性差
        b. 代码冗余
        c. 管理维护的难度极大,扩展性

        具备某一个功能的工具就是程序的中函数 #‘函数即变量’
        事先准备工具的过程----》函数的定义
        拿来就用----》函数的调用

        所以函数的使用必须遵循:先定义,再调用

    五、定义函数

    1、语法

    def 函数名(参数1,参数2,...):

        """

        文档描述

        """

        代码1

        代码2

        代码3

        return 值

    def:定义函数的关键字

    函数名:是用来调用函数的,函数名的命名必须能反映出函数的功能

    文档描述:推荐写上,来增强函数的可读性

    代码块:函数的功能实现代码

    return:函数的返回值

    2. 定义阶段

    def print_sym(sym,count): #print_sym=<function print_msg at 0x000001B2A33698C8>    #十六进制,表在内存中的位置
       
    print(sym*count)
     
    def print_msg(msg):
        print('33[045m%s33[0m' %msg] 

    3. 调用阶段:函数名加括号就是在调用函数
    print_sym('#',30)
    print_msg('hello egon')
    print_sym('#',30)

    4、 定义函数的三种类型

    a. 有参函数:参数是函数代码用来接收外部传入值的

    def max2(x,y): #x=100,=y101
       
    if  x > y:
            print(x)
        else:
            print(y)

       max2(100,101)

    b. 无参参数:当函数体的代码逻辑不需要函数的调用者掺入值的情况下,就无参

    #无参参数相对用的不多

    def interactive():
        name=input('username>>: ').strip()
        pwd=input('password>>: ').strip()
        print(name,pwd)

        interactive() #定义时无参,意味着调用时也无须传入参数
        interactive() #定义时无参,意味着调用时也无须传入参数
        interactive() #定义时无参,意味着调用时也无须传入参数

    c. 空函数:函数体为pass

    def auth():
        """
       
    这是一个认证功能
       
    :return:
        """
       
    pass

    def
    put():
        """
       
    上传功能
       
    :return:
        """
       
    pass

    def
    get():
        """
       
    下在功能
       
    :return:
        """
       
    pass

    def
    ls():
        """
        list contents
       
    :return:
        """
       
    pass
     
     
     
    d. 练习
    uname_of_db='egon'
    pwd_of_db='123'

    def interactive():
        uname_of_db=input('username: ').strip()
        pwd_of_db=input('password: ').strip()
        return uname_of_db, pwd_of_db


    def auth(uname,pwd):
        if uname==uname_of_db and pwd==pwd_of_db:
            print('登陆成功')
        else:
            print('登陆失败')

    res=interactive()
    x=res[0]
    y=res[1]
    auth(x,y)
     
    #函数的功能越细越好。比如,认证可分为输入和对比
     
    5. 函数的调用
    函数的使用必须遵循:先定义后调用的原则
    注意:没事先定义函数而直接调用,就相当于引用一个不存在的变量名
    定义阶段:在定义阶段只检测语法,不执行函数体代码
    调用阶段:根据函数名找到函数的内存地址,然后执行函数体代码
     
    运行以下代码,不报错,因为没有语法错误
    def func():
       xxx
    运行以下代码,报错,因为有语法错误
    def func():
      print('sadfsadf'
     
    运行以下代码,不报错,因为定义在调用之前,若将foo()前移,则报错
    def bar():    #定义阶段
      print('from bar')
    def foo():
      print('from foo')
      bar()

    foo()      #
    调用阶段
     
    6. 调用函数的三种形式
    a. 语句形式:foo()
    def func():
        print('from func')

    func()
     
    b. 表达式形式:3*len('hello')
    def max2(x,y):
        if x > y:
            return x
        else:
            return y

    res=max2(10,3)
    print(res)
     
    c. 当中另外一个函数的参数:range(len('hello'))
    def max2(x,y):
        if x > y:
            return x
        else:
            return y

    res=max2(max2(10,3),11)
    print(res)
     
    6. 函数的返回值
    什么时候应该有返回值:函数体代码运行完毕后需要有一个返回结果给调用者
     
    返回值的三种形式
    a.     没有return,返回值为None
    def func():
        pass

    res=func()
    print(res)
     
    b.     return后跟一个值,返回该值本身
    def func1():
        return 1

    res=func1()
    print(res)
     
    c.      return可以逗号分隔,返回多个值,会返回一个元组给调用者
    def func2():
        return 1,2,[1,2,3]   #等同于return (1,2,[1,2,3])

    res=func2()
    print(res)
     
    return的注意点:
    a.     return返回值的值,没有类型限制
    b.     return是函数结束的标志,函数内可以写多个return,但执行一次,函数就立刻结束,并把return后的值作为本次调用的返回值
     
    def func3():
        print('first')
        return 1    #return 1 然后结束
        print('second')
        return 2
        print('third')
        return 3

    res=func3()
    print(res)
     
  • 相关阅读:
    如何快速定位到DBGrid的某一行!!!急...
    说说设计模式~单件模式(Singleton)
    EF架构~终于自己架构了一个相对完整的EF方案
    .Net——实现IConfigurationSectionHandler接口定义处理程序处理自定义节点
    在LINQ中实现多条件联合主键LEFT JOIN
    从LINQ开始之LINQ to Objects(上)
    WPF控件模板和数据模板
    WPF的ListView控件自定义布局用法实例
    初步探讨WPF的ListView控件(涉及模板、查找子控件)
    LINQ技巧:如何通过多次调用GroupBy实现分组嵌套
  • 原文地址:https://www.cnblogs.com/zhangyaqian/p/py20180326.html
Copyright © 2011-2022 走看看