zoukankan      html  css  js  c++  java
  • python第三天

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

    1

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

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

    可进行模糊查询,语法至少支持下面3种:
      select name,age from staff_table where age > 22
      select * from staff_table where dept = "IT"
    select * from staff_table where enroll_date like "2013"
    查到的信息,打印后,最后面还要显示查到的条数
    select * from db.emp where id = 7
    可创建新员工纪录,以phone做唯一键,staff_id需自增
    insert into db1.emp () values ();
    insert into db.emp values 7,崔晓娜,18,13716114868,运维,2017-09-1819:14:46;
    可删除指定员工信息纪录,输入员工id,即可删除
    delete from db1.emp where id = ;
    delete from db.emp where id = 7
    可修改员工信息,语法如下:
      UPDATE staff_table SET dept="Market" WHERE where dept = "IT"
    update db.emp set job = 开发 where id = 7

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

    一 介绍

    计算机系统分为:计算机硬件,操作系统,应用程序三部分。

    我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

    有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

    #1. 打开文件,得到文件句柄并赋值给一个变量

    #2. 通过句柄对文件进行操作

    #3. 关闭文件

    二 在python中

    复制代码

    #1. 打开文件,得到文件句柄并赋值给一个变量

    f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

    #2. 通过句柄对文件进行操作

    data=f.read()

    #3. 关闭文件

    f.close()

    三 f=open('a.txt','r')的过程分析

    #1、由应用程序向操作系统发起系统调用open(...)

    #2、操作系统打开该文件,并返回一个文件句柄给应用程序

    #3、应用程序将文件句柄赋值给变量f

    #强调第一点:

    打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:

    1、f.close() #回收操作系统级打开的文件

    2、del f #回收应用程序级的变量

    其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,

    而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()

    虽然我这么说,但是很多同学还是会很不要脸地忘记f.close(),对于这些不长脑子的同学,我们推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文

    with open('a.txt','w') as f:

        pass

    with open('a.txt','r') as read_f,open('b.txt','w') as write_f:

        data=read_f.read()

        write_f.write(data)

    #强调第二点:

    f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

    这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。

    f=open('a.txt','r',encoding='utf-8')

    二 打开文件的模式

    文件句柄 = open('文件路径', '模式')

    模式可以是以下方式以及他们之间的组合:

    CharacterMeaning

    ‘r'open for reading (default)

    ‘w'open for writing, truncating the file first

    ‘a'open for writing, appending to the end of the file if it exists

    ‘b'binary mode

    ‘t'text mode (default)

    ‘+'open a disk file for updating (reading and writing)

    ‘U'universal newline mode (for backwards compatibility; should not be used in new code)

    复制代码

    #1. 打开文件的模式有(默认为文本模式):

    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】

    w,只写模式【不可读;不存在则创建;存在则清空内容】

    a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】

    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)

    rb 

    wb

    ab

    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

    #3. 了解部分

    "+" 表示可以同时读写某个文件

    r+, 读写【可读,可写】

    w+,写读【可读,可写】

    a+, 写读【可读,可写】

    x, 只写模式【不可读;不存在则创建,存在则报错】

    x+ ,写读【可读,可写】

    xb

    三 操作文件的方法

    #掌握

    f.read() #读取所有内容,光标移动到文件末尾

    f.readline() #读取一行内容,光标移动到第二行首部

    f.readlines() #读取每一行内容,存放于列表中

    f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符

    f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符

    f.writelines(['333\n','444\n']) #文件模式

    f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

    #了解

    f.readable() #文件是否可读

    f.writable() #文件是否可读

    f.closed #文件是否关闭

    f.encoding #如果文件打开模式为b,则没有该属性

    f.flush() #立刻将文件内容从内存刷到硬盘

    f.name


    一 函数知识体系

    复制代码
    1 什么是函数?
    2 为什么要用函数?
    3 函数的分类:内置函数与自定义函数
    4 如何自定义函数
    语法
    定义有参数函数,及有参函数的应用场景
    定义无参数函数,及无参函数的应用场景
    定义空函数,及空函数的应用场景

    5 调用函数
    如何调用函数
    函数的返回值
    函数参数的应用:形参和实参,位置参数,关键字参数,默认参数,*args,**kwargs

    6 高阶函数(函数对象)
    7 函数嵌套
    8 作用域与名称空间
    9 装饰器
    10 迭代器与生成器及协程函数
    11 三元运算,列表解析、生成器表达式
    12 函数的递归调用
    13 内置函数
    14 面向过程编程与函数式编程

    一 如何自定义函数?

    复制代码
    #语法
    def 函数名(参数1,参数2,参数3,...):
    '''注释'''
    函数体
    return 返回的值

    #函数名要能反映其意义

    二 函数使用的原则:先定义,再调用

    三 函数在定义阶段都干了哪些事?

    #只检测语法,不执行代码
    也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道

    四 定义函数的三种形式

    #1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
    #2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
    #3、空函数:设计代码结构

    一 调用函数

    函数的调用:函数名加括号
    1 先找到名字
    2 根据名字调用代码
    二 函数返回值

    无return->None
    return 1个值->返回1个值
    return 逗号分隔多个值->元组
    什么时候该有返回值?
        调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
        通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
    什么时候不需要有返回值?
        调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
        通常无参函数不需要有返回值
    三 函数调用的三种形式

    1 语句形式:foo()
    2 表达式形式:3*len('hello')
    3 当中另外一个函数的参数:range(len('hello'))
    四 函数的参数

    一 形参与实参

    #形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定


    二 具体应用


    复制代码
    #1、位置参数:按照从左到右的顺序定义的参数
    位置形参:必选参数
    位置实参:按照位置给形参传值

    #2、关键字参数:按照key=value的形式定义的实参
    无需按照位置为形参传值
    注意的问题:
    1. 关键字实参必须在位置实参右面
    2. 对同一个形参不能重复传值

    #3、默认参数:形参在定义时就已经为其赋值
    可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
    注意的问题:
    1. 只在定义时赋值一次
    2. 默认参数的定义应该在位置形参右面
    3. 默认参数通常应该定义成不可变类型


    #4、可变长参数:
    可变长指的是实参值的个数不固定
    而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs

    ===========*args===========
    def foo(x,y,*args):
    print(x,y)
    print(args)
    foo(1,2,3,4,5)

    def foo(x,y,*args):
    print(x,y)
    print(args)
    foo(1,2,*[3,4,5])


    def foo(x,y,z):
    print(x,y,z)
    foo(*[1,2,3])

    ===========**kwargs===========
    def foo(x,y,**kwargs):
    print(x,y)
    print(kwargs)
    foo(1,y=2,a=1,b=2,c=3)

    def foo(x,y,**kwargs):
    print(x,y)
    print(kwargs)
    foo(1,y=2,**{'a':1,'b':2,'c':3})


    def foo(x,y,z):
    print(x,y,z)
    foo(**{'z':1,'x':2,'y':3})

    ===========*args+**kwargs===========

    def foo(x,y):
    print(x,y)

    def wrapper(*args,**kwargs):
    print('====>')
    foo(*args,**kwargs)

    #5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
    可以保证,传入的参数中一定包含某些关键字
    def foo(x,y,*args,a=1,b,**kwargs):
    print(x,y)
    print(args)
    print(a)
    print(b)
    print(kwargs)

    foo(1,2,3,4,5,b=3,c=4,d=5)
    结果:
    1
    2
    (3, 4, 5)
    1
    3
    {'c': 4, 'd': 5}

  • 相关阅读:
    mysql报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    MD5登陆密码的生成
    15. 3Sum、16. 3Sum Closest和18. 4Sum
    11. Container With Most Water
    8. String to Integer (atoi)
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    几种非线性激活函数介绍
    AI初探1
    AI初探
  • 原文地址:https://www.cnblogs.com/wdee/p/7580146.html
Copyright © 2011-2022 走看看