zoukankan      html  css  js  c++  java
  • day3 函数 位置参数 关键字参数 非固定参数 全局与局部变量 员工信息查询作业

    一、函数

    函数是什么?

    函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。

    定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

    特性:

    1. 减少重复代码
    2. 使程序变的可扩展
    3. 使程序变得易维护

    形参变量  

      只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

    实参  

      可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

    默认参数  

      def stu_register(name,age,course,country="CN"):  这样,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。

    关键参数

    正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置

    非固定参数

    若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数

    *args

    *args 会把多传入的参数变成一个元组形式

    **kwargs

    *kwargs 会把多传入的关键字参数变成一个dict形式

    全局与局部变量

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
    当全局变量与局部变量同名时:
    在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
    当全局变量与局部变量同名时:
    在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
    一些简单的str、int类型的参数可以不再函数内部被改变,但是如list等复杂的变量可以在函数内被修改
     
    返回值
    函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束

    如果未在函数中指定return,那这个函数的返回值为None 

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author:Glen
    
    
    # 递归函数
    def calc(n):
        print(n)
        if int(n/2) == 0:  # 条出递归函数的条件
            return n        # 返回n,不再是函数
        return calc(int(n/2))
    
    
    '''
    函数的参数
    1 形参 形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
    2 实参 可以是任何类型,把值传给形参
    '''
    
    
    # 默认参数 位置参数
    def fun1(name, age, sex='n'):
        print(name, sex, age)
    
    fun1('glen', 26)  # sex有默认参数,因此可以不用赋值
    # fun1('glen', sex='f', 26)  # 位置参数必须放在关键字参数前面,否则报错
    fun1('glen', 25, 'f')  # 传参数时sex='f' 或者 'f',都可以,但是这样做的时候参数的顺序必须固定
    
    
    # 关键字参数
    def fun2(name='glen', age=22, country='cn'):
        print(name, age, country)
    
    
    # 正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,
    # 只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。
    fun2('jack', age=33, country='us')
    
    
    # 非固定参数
    # 若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数
    def fun3(name, age, *args):
        print(name, age, args)
    fun3('glen', 26, 'CN', 'IT', 'CD')  # *args 会把多传入的参数变成一个元组形式
    # 还可以有一个**kwargs
    def fun4(name, age=26, *args, country='cn', **kwargs):
        print(name, age, args, country, kwargs)
    fun4('glen', 23, 'a', 'b', a=1, b=2, c=3)  # 把没有定义的关键字参数放入一个字典
    
    # 局部变量
    name = 'glen'
    list_test = [1, 2, 3, 7]
    age = 23
    def change_name():
        global age  # global声明为全局变量,可以实现修改,但是不能这么做,函数被调用一次就会修改一次,逻辑混乱
        age = 26
        name = 'jack'  # 只在这个函数的内部生效,且调用周期结束就回收
        list_test[0] = 9  # 列表可以在被调用的函数里面修改,不能被修改的只能时字符串等一些简单变量
        print(name)
    change_name()
    print(name)  # 没有被改变
    print(list_test)  # 列表在函数内被改变了
    print(age)  # 被修改了
    
    
    def fun5(n):
        if n == 5:
            return 5  # 当n=5时有返回值,为5,否则就返回None
    a = fun5(6)
    b = fun5(5)
    print(a, b)
    

      

     二、作业

    有以下员工信息表

     

    当然此表你在文件存储时可以这样表示

    1
    1,Alex Li,22,13651054608,IT,2013-04-01

    现需要对这个员工信息文件,实现增删改查操作

    1. 可进行模糊查询,语法至少支持下面3种:
      1.   select name,age from staff_table where age > 22
      2.   select  * from staff_table where dept = "IT"
      3.       select  * from staff_table where enroll_date like "2013"
      4. 查到的信息,打印后,最后面还要显示查到的条数 
    2. 可创建新员工纪录,以phone做唯一键,staff_id需自增
    3. 可删除指定员工信息纪录,输入员工id,即可删除
    4. 可修改员工信息,语法如下:
      1.   UPDATE staff_table SET dept="Market" WHERE where dept = "IT"

     注意:以上需求,要充分使用函数,请尽你的最大限度来减少重复代码!

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # Author:Glen
    
    emp = {}
    staff_id_que = (x for x in range(1000))
    select = {'op': 'select', 'field': [], 'condition': []}
    update = {'op': 'update', 'field': [], 'condition': []}
    
    
    def read_to_emp():
        with open('emp', 'r') as f:
            for line in f:
                emp[line.split(',')[3]] = dict(zip(['staff_id', 'name', 'age', 'phone', 'dept', 'enroll_date'], line.split(',')))
    
    
    def cmd_exec(cmd):
        for key in emp:
            for field in cmd['field']:
                condition_field = cmd['condition'][0]
                condition_op = cmd['condition'][1]
                condition_value = cmd['condition'][2]
                if condition_op == '=':
                    if emp[key][condition_field] == condition_value:
                        if cmd['op'] == 'update':
                            emp[key][cmd['field'][0]] = cmd['field'][1]
                        else:
                            print(emp[key][field] + ' ', end='')
                elif condition_op == '<':
                    if int(emp[key][condition_field]) < int(condition_value):
                        if cmd['op'] == 'update':
                            emp[key][cmd['field'][0]] = cmd['field'][1]
                        else:
                            print(emp[key][field] + ' ', end='')
                else:
                    if int(emp[key][condition_field]) > int(condition_value):
                        if cmd['op'] == 'update':
                            emp[key][cmd['field'][0]] = cmd['field'][1]
                        else:
                            print(emp[key][field] + ' ', end='')
    
    
    def handle_cmd(cmd='select name,age from emp where age > 10'):
        if cmd.startswith('select'):
            select_field = cmd.split()[1]
            select_condition = cmd.split()[4:]
            if select_field == '*':
                select['field'] = ['staff_id', 'name', 'age', 'phone', 'enroll_date']
            else:
                select['field'] = select_field.split(',')
            if select_condition:
                select['condition'] = select_condition[1:]
            cmd_exec(select)
        elif cmd.startswith('update'):
            update_file = cmd.split()[3]
            update_condition = cmd.split()[5:]
            update['field'] = update_file.split('=')
            update['condition'] = update_condition
            cmd_exec(update)
    
    
    def write_to_file(member):
        with open('emp', 'w') as f2:
            for key in member:
                line = '%s,%s,%s,%s,%s,%s' % (member[key]['staff_id'], member[key]['name'], member[key]['age'], member[key]['phone'], member[key]['dept'], member[key]['enroll_date'],)
                print(line)
                f2.write(line)
    
    
    read_to_emp()
    while True:
        print(emp)
        command = input('>')
        if command.startswith('select') or command.startswith('update'):
            handle_cmd(command)
        elif command == 'w':
            write_to_file(emp)
        elif command == 'q':
            exit(0)
        else:
            print('input error')
    

      

  • 相关阅读:
    清除富文本样式
    jquery--cookie应用
    Log4j 配置详解
    判断请求是否为ajax
    日期工具类
    Windows Server2012 KB2919355 补丁无法安装
    安装系统步骤:
    大白菜u盘启动盘制作工具取消赞助商方法详解
    视频使用教程
    检查网络是否正常的几种命令
  • 原文地址:https://www.cnblogs.com/starcor/p/9486312.html
Copyright © 2011-2022 走看看