zoukankan      html  css  js  c++  java
  • python自动化开发-[第三天]-编码,函数,文件操作

    今日概要

        - 编码详解

        - 文件操作

        - 初识函数

    一、字符编码

    1、代码执行过程

      代码-->解释器翻译-->机器码-->执行

    2、ASCII

      ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符)

      后来为了将拉丁文也编码进了ASCII表,将最高位也占用了

    3、GBK

      GBK::2Bytes代表一个字符

      日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr

    4、Unicode(万国码)

     至少2Bytes代表一个字符, 2**16-1=65535,可代表6万多个字符,因而兼容万国语言

    5、UTF-8

      UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes

    6、unicode和uft-8的优缺点

      unicode处理速度快,字符转换数字快,缺点占用空间多(无论字母或者中文都是2bytes)

      uft-8的优点占用空间小,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示

    7、unicode和utf-8的注意事项

    1. 内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。

    8、python程序执行过程

      1、启动python解释器

      2、解释器打开文本编辑器,从硬盘中读取内容到内存

      3、读取已经加载到内存的代码(unicode编码的二进制),然后进行执行,执行的过程中可能开辟新的内存空间,比如x='dragon'

          notice:

          不是所有在内存的编码都是unicode

          x = 'dragon'在内存的编码是unicode,此时将代码换成x = 'dragon'.encode('utf-8'),那么新申请的内存空间里存放为utf-8编码

      详细过程图如下:

    9、打开网页过程

        打开网页服务器会把动态生成的unicode内容转换为utf-8在传给浏览器,如何服务端encode编码格式为utf-8,客户端内存中接收到的utf-8编码的二进制

    10、python2中编码区别

      在python2中,str就是编码后的结果bytes,str=bytes,所以在python2中,unicode字符编码的结果是str/bytes  

    #-*- coding:utf-8 -*- 
    s='牛' #在执行时,'牛'会被以conding:utf-8的形式保存到新的内存空间中
    
    print repr(s) #'xe6x9ex98' 三个Bytes,证明确实是utf-8
    print type(s) #<type 'str'>
    
    s.decode('utf-8')
    # s.encode('utf-8') #报错,因为s的编码为bytes,只能decode
    

       unicode类型

      当python解释器执行到产生字符串的代码时(例如s=u'牛'),会申请新的内存地址,然后将'牛'以unicode的格式存放到新的内存空间中,所以s只能encode,不能decode

    s=u'牛'
    print repr(s) #u'u6797'
    print type(s) #<type 'unicode'>
    
    
    # s.decode('utf-8') #报错,s为unicode,所以只能encode
    s.encode('utf-8') 
    

    二、文件操作

      1、文件处理的基本流程

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

        (2)通过文件句柄对文件进行操作

        (3)关闭文件,释放内存

    f = open('cashi') #打开文件
    first_line = f.readline()  #读取一行 readlines读取全部返回一个list
    data = f.read()# 读取剩下的所有内容,文件大时不要用
    print(data) #打印读取内容
     f.close() #关闭文件
    

       2、打开文件几种操作方式

      打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

      打开文件的模式有:

    • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    • w,只写模式【不可读;不存在则创建;存在则清空内容】
    • x, 只写模式【不可读;不存在则创建,存在则报错】
    • a, 追加模式【可读;   不存在则创建;存在则只追加内容】

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

    • r+, 读写【可读,可写】
    • w+,写读【可读,可写】
    • x+ ,写读【可读,可写】
    • a+, 写读【可读,可写】

       "b"表示以字节的方式操作

    • rb  或 r+b
    • wb 或 w+b
    • xb 或 w+b
    • ab 或 a+b

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

      3、buffer和cache的区别

      写入文件的操作也都是存入内存缓冲区buffer(内存速度快于硬盘,如果写入文件的数据都从内存刷到硬盘,内存与硬盘的速度延迟会被无限放大,效率变低,所以要刷到硬盘的数据我们统一往内存的一小块空间即buffer中放,一段时间后操作系统会将buffer中数据一次性刷到硬盘)

      4、flush-将写入数据刷入硬盘

    import time
    with open('3.txt','w+',encoding='utf-8') as f :
        for i in range(10):
    
            f.write(str(i))
            f.flush()
            time.sleep(0.5)
    

       5、文件的光标移动,seek,tell,read,truncate

      read(3)代表读取3个字符,其余的文件内光标移动都是以字节为单位如seek,tell,read,truncate

      f.seek(3) #seek内指定的数字代表字节

      seek(3) #默认情况,是以文件起始位置作为开始,往后移动3个bytes

      seek(2,1) #1 代表以当前光标所在的位置为开始,往后移动2个 bytes

      seek(-1,2) #2表以当前光标所在的位置为开始,往后移动2个 bytes

      tell() #当前光标所在的位置

      truncate清空文件

      6、with上下文管理器

    with open('a.txt','r',encoding='utf-8') as f
         print(f.read())
         print('====>')
    
    #这样就不需要进行f.close()关闭文件句柄
    

       7、模拟tailf模式看access日志

      

    import time
    
    with open('access.log','r',encoding='utf-8') as f:
        f.seek(0,2)
        while True:
            line = f.readline().strip()
            if line:
                print('-----',line)
    
            time.sleep(0.5)
    

       8、文件修改

    #文件修改
    import os
    
    
    read_f = open('b.txt','r',encoding='utf-8')
    write_f = open('.swp.b.txt','w',encoding='utf-8')
    
    
    for line in read_f.readlines():
        if line.startswith('1111'):
            line = '2222222
    '
        write_f.write(line)
    
    read_f.close()
    write_f.close()
    
    os.remove('b.txt')
    os.rename('.swp.b.txt','b.txt')
    

    三、初识函数

      1、无函数的代码

        (1)无结构,可读性差

        (2)代码冗余特别高  

      2、python函数,定义方法

    python中函数定义方法:
    def test(x):
       "The function definitions"
        x+=1
       return x
          
    def:定义函数的关键字
    test:函数名
    ():内可定义形参
    "":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
    x+=1:泛指代码块或程序处理逻辑
    return:定义返回值
    

      3、python函数分类

       1、内置函数

    #python自带的内置函数,直接调用就可以
    max
    min
    
    a=len('dragon')
    print(a)
    
    b=max([1,2,3])
    print(b)

       2、自定义函数

         1.无参数函数

    #自定义函数
    
    
    def print_star():
        print('#'*6)
    
    def print_msg():
        print('hello world')
    
    #函数调用
    
    print_star()
    print_msg()
    

         2.有参数函数

          1.位置参数-位置实参与形参一一对应

    位置参数
    def foo(x,y,z):#位置形参:必须被传值的参数
        print(x,y,z)
    
    # foo(1,2,3)
    foo(1,2,3) #位置实参数:与形参一一对应

          2.关键字参数

            注意事项

            1:关键字实参必须在位置实参后面

            2: 不能重复对一个形参数传值 

    关键字参数:key=value
    
    def foo(x,y,z):
        print(x,y,z)
    
    foo(z=3,x=1,y=2)
    foo(1,z=3,y=2) #正确
    foo(x=1,2,z=3) #错误
    
    foo(1,x=1,y=2,z=3)
    

          3.默认参数

    #默认参数
    
    def register(name,age,sex='male'): #形参:默认参数
        print(name,age,sex)
    
    register('asb',age=40)
    register('a1sb',39)
    register('a2sb',30)
    register('a3sb',29)
    
    register('钢蛋',20,'female')
    register('钢蛋',sex='female',age=19)
    
    #默认参数需要注意的问题:
    #*****一:默认参数必须跟在非默认参数后
    def register(sex='male',name,age): #在定义阶段就会报错
        print(name,age,sex)
    
    #二:默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次
    a=100000000
    def foo(x,y=a):
        print(x,y)
    a=0
    foo(1)
    
    #三:默认参数的值通常定义成不可变类型
    

          4.可变长参数(*args,**kwargs)

     *会把溢出的按位置定义的实参都接收,以元组的形式赋值给args

     **会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs

    def foo(x,y,*args): 
        print(x,y)
        print(args)
    
    foo(1,2,3,4,5)
    
    
    def add(*args):
        res=0
        for i in args:
            res+=i
        return res
    print(add(1,2,3,4))
    print(add(1,2))
    
    
    
    def foo(x, y, **kwargs):  
        print(x, y)
        print(kwargs)
    foo(1,2,a=1,name='egon',age=18)

          5.命令关键字参数

    def foo(name,age,*,sex='male',height):
        print(name,age)
        print(sex)
        print(height)
    #*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参的形式去传值
    foo('egon',17,height='185')
    
    
    
    def foo(name,age=10,*args,sex='male',height,**kwargs):
    def foo(name,age=10,*args,sex='male',height,**kwargs):
        print(name)
        print(age)
        print(args)
        print(sex)
        print(height)
        print(kwargs)
    
    foo('alex',1,2,3,4,5,sex='female',height='150',a=1,b=2,c=3)
    

         3.空函数 

    def delete():
        pass
    
    def insert()
        pass
    

      4、函数的调用

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    def foo():
        print('from foo')
    
    def bar(name):
        print('bar===>',name)
    
    #按照有参和无参可以将函数调用分两种
    foo() #定义时无参,调用时也无需传入参数
    bar('egon') #定义时有参,调用时也必须有参数
    
    
    #按照函数的调用形式和出现的位置,分三种
    
    foo() #调用函数的语句形式
    
    def my_max(x,y):
        res=x if x >y else y
        return res
    
    # res=my_max(1,2)*10000000 #调用函数的表达式形式
    # print(res)
    
    
    res=my_max(my_max(10,20),30) #把函数调用当中另外一个函数的参数
    print(res)
    

       5、三元运算

    #正常方法
    x=10
    y=2
     if x > y:
         print(x)
     else:
         print(y)
    
    #简化版方法
     res=x if x > y else y
     print(res)
    

     

      

  • 相关阅读:
    5G和物联网:面临各种安全挑战的新兴技术
    嵌入式Linux系统的几大组件!
    物联网应用开发如何平衡用户体验与隐私安全?
    我们需要什么数据架构?
    2020.7.30
    2020.7.29
    2020.7.28
    2020.7.27
    2020.7.26 + 周报(3)
    2020.7.25
  • 原文地址:https://www.cnblogs.com/liujiliang/p/6878832.html
Copyright © 2011-2022 走看看