首页 > 代码库 > python 第三天

python 第三天

一、字符编码

字符编码:把人的字符翻译成计算机能够认识的数字。

字符编码表:就是一张字符与数字对应关系的表。

例如:ascii、gbk、utf-8、unicode


unicode ----> encode(‘utf-8‘) ----> bytes

bytes   ----> decode(‘utf-8‘) ----> unicode


python3中的字符串分为2种:

x=‘aa‘#存成unicode

y=x.encode(‘utf-8‘)#此时转存成bytes

 unicode与bytes#python3默认是unicode


python2中的字符串也分为2种:

x=u‘aa‘#与python3的字符串概念一样

y=‘bb‘#与pyhton3的bytes一样。

unicode与bytes

python3默认的格式就是unicode


总之一句话:字符以什么格式编码、就要以什么格式解码。


二、文件的操作

1、r读模式、文件不存在的时候,不会创建文件。

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

print(f.read())

1.1 b模式:#此时不在需要制定编码格式

f = open(‘a.txt‘,‘br‘)

print(f.read())

f.close()

#指定字符解码

f = open(‘a.txt‘,‘rb‘)

print(f.read().decode(‘utf-8‘))

f.close()


1、w写模式、文件存在清空文件、不存在创建文件。

f = open(‘a.txt‘,‘w‘)

f.write(‘111‘)

f.close()


1.1、writeable 是否可写

f = open(‘a.txt‘,‘w‘)

f.write(‘111‘)

print(f.writable())

f.close()

1.2、写入一行:

f = open(‘a.txt‘,‘w‘)

f.writelines(‘1111\n22222222222‘)

f.close()

1.3、a追加模式、文件不存在创建、文件存在跳到文件末尾。

f = open(‘a.txt‘,‘a‘)

f.writelines(‘111a1\n22222222222‘)

f.close()

1.3.1、查看文件的光标位置

f = open(‘a.txt‘,‘a‘)

f.writelines(‘111a1\n22222222222‘)

print(f.tell())#打印光标的位置,追加一般光标会到结尾处。

f.close()

#打开文件就会跳到文件的结尾处、文件不存在的时候会创建文件。


总结:

文件的操作方式中:读只能读不能追加和写入、写只能写不能读和追加、追加也只追加,但这是默认的情况,如果需要在写的时候读或者在读的时候写请使用权限a+,r+,w+

文件的操作方法中:只有w和a在文件不存在的情况下才会创建文件。


1.4 rb模式、直接读取bytes模式。

f = open(‘a.txt‘,‘rb‘)

print(f.read())

1.4.1 wb模式、直接写入b模式,但是默认情况是不能直接写入的、需要encode。

f = open(‘a.txt‘,‘wb‘)

f.write(‘aaaaa‘.encode(‘utf-8‘))


1.4.2 ab 模式需要加encode


需要注意的是:我们在文件操作结束后执行的f.close()操作,其实是在操作系统层面上关闭了文件,但是在程序中所定义的f = open()变量依然还是存在的。只有del 变量 ,变量才会清除。也就是说文件关闭了,但是方法依然存在,且方法不能执行!!!!


1.4、cpoy 文件使用rb和wb

import  sys

if len(sys.argv) < 3:

    print(‘参数不够!‘)

elif len(sys.argv) > 3:

    print(‘参数不对!‘)

else:

    with open(r‘%s‘ %sys.argv[1],‘rb‘) as read_f,open(r‘%s‘ %sys.argv[2],‘wb‘) as write_f:

        for line in read_f:

            write_f.write(line)


#使用rb模式就不在需要考虑编码的问题了。


1.5 文件的其他操作:文件的操作read()默认是以字符为基础,全部读取,一次默认读取一个字符。

f =open(‘a.txt‘,‘r‘)

print(f.read())


f =open(‘a.txt‘,‘rb‘)

print(f.read(3).decode(‘utf-8‘))

#一个中文汉字占3个字符位、如果在read过程中字符数如果不是3的倍数、会报错,默认以字节为单位读取。

seek()控制光标的位置。默认以文件开头为参照.

0代表从头开始,1代表当前位置,2代表文件最末尾位置。  


你好啊xiaoming


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

print(f.read(1))

print(f.tell())

f.seek(6)

print(f.read(1))


3


f = open(‘a.txt‘,‘rb‘)

print(f.read(3).decode(‘utf-8‘))

print(f.tell())

f.seek(6,0)

print(f.read(3).decode(‘utf-8‘))


3


f = open(‘a.txt‘,‘rb‘)

print(f.read(3))

print(f.tell())

f.seek(3,1)

print(f.tell())

print(f.read().decode(‘utf-8‘))


b‘\xe4\xbd\xa0‘

3

6

啊xiaominghehe


seek 有3中模式。0 1 2

1和2模式必须在b模式下才可运行


0模式以文件开头

1模式以当前的光标为参照物


#模拟tailf 命令

import  time

import  sys


with open(r‘%s‘ %sys.argv[2],‘rb‘) as f:

    f.seek(0,2)

    while True:

        line = f.readline()

        if line:

            print(line.decode(‘utf-8‘),end=‘‘)

        else:

            time.sleep(0.3)


1.6 truncate 截取字符


你好啊xiaoming

with open(‘a.txt‘,‘r+‘,encoding=‘utf-8‘) as f:

    f.truncate(9)

你好啊


#但是如果截取的字符少了,会出现乱码的情况

如果文件为空,截取为空格。


三、函数

随着程序的功能越多、代码的复杂度也越来越大、组织结构不清晰、可读性较差。

代码的冗余和可扩展性差。工具即函数、使用即调用。


1、函数的分类:

1、内置函数

len() print() max() ……

2、自定义函数

2、函数的使用:

1、先定义函数{定义函数只是检查语法、不执行代码}

2、在调用函数


函数的定义与变量的定义类似、没有事先定义变量、而直接引用变量,会报错。

没有事先定义函数、而直接调用函数、就相当于引用一个不存在的变量名。


3、函数的定义:

def 函数名(arg1,arg2,arg3):

‘‘‘注释‘‘‘

函数体

return 返回值没有类型的限制、return可以有多个、但是只会执行一次、并且将return后面的结果返回。没有return 返回none。


有参函数都需要返回值、无参函数一般不需要返回值。

函数的调用可以当做其他函数的参数。



函数名:一般是动词、注释信息一定要有

参数 。。。。


4、定义函数的三种形式:

1、无参函数:仅仅用来执行一些操作、比如用户交互、打印。

2、有参函数:需要外部传进来的参数、才能执行相关的逻辑。

3、空函数:设计代码的结构。



5、函数的参数分为实参和形参。

实参会占用内存空间,形参不占用内存空间。

形参就是变量名:实参就是变量值。

函数在调用阶段实参才会绑定形参。



6、参数的分类;

1、位置参数:位置按照从左到右的顺序依次定义的参数。

位置形参:定义变量

位置实参:与形参一一对应


语法规定:位置实参必须在关键字实参的前面。

同一个形参不能传多次值。


2、关键字实参:指名道姓给name传值、name=value



3、默认形参:在定义阶段就已经为形参赋值、意味着在调用阶段可以不用传值。


def foo(x,y=11111):

   print(x)

   print(y)


foo(1,‘a‘)


默认参数必须放在位置参数之后。默认参数只在定义阶段赋值一次、而且只是一次。

默认参数的值应该定义成不可变的类型。****



7、可变长参数是指实参的个数不固定。

实参分为位置实参与关键字实参2种。


形参必须要有2中机制来分别处理按照位置定义的实参溢出的情况:*

按照关键字定义的实参溢出的情况**


溢出的参数按位置交个*处理、并且会将这些溢出的参数赋值给args

如果没有溢出的情况,args返回一个空元组。


def foo(x,y,*args):

    print(x)

    print(y)

    print(args)


foo(1,2,3,4,5,6,7)


def foo(x,y,**kwargs):

    print(x)

    print(y)

    print(args)


foo(x=1,y=2,z=3)

1

2

{‘z‘: 3}

#关键字溢出会将溢出的参数放到一个字典中保存。

*代表位置参数,

在*后面定义的形参成为关键字参数、必须以关键字形参形式传参。

*后面的形参必须要关键字传参。

def foo(name,age,*,sex=‘male‘,group):

    print(name)

    print(age)

    print(sex)

    print(group)


foo(‘zs‘,111,group=‘sc‘,sex=‘male‘)

zs

111

male

sc


*agrs 与**kwargs 联用。

def foo(name,age=100,*args,sex=‘male‘,group,**kwargs):



**代表关键字参数

一个参数不能赋值2次。!!




*args 扩展方法:

def foo(x,y,*args):

    print(x)

    print(y)

    print(args)


foo(1,5,*(1,3,4,5))

1

5

(1, 3, 4, 5)


def foo(x,y):

    print(x)

    print(y)

    print(args)


foo(*(4,5))

4

5


函数是第一类的对象:指的是函数可以被当做数据传递。

函数可以当做函数的返回,可以当做容器类型的元素。

练习1、写函数,,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作

法1、

import os

def file(file,key,new_key):

    with open(r‘%s‘ %file,‘r‘,encoding=‘utf-8‘) as file_r,open(‘.file‘,‘w‘,encoding=‘utf-8‘) as file_w:

        for line in file_r:

            file_w.write(line.replace(key,new_key))

    os.remove(file)

    os.rename(‘.file‘,file)


file(‘db‘,‘xiaoming‘,‘dsb‘)


法2、

import re,os

def file(file,key,key_new):

    file_open = open(r‘%s‘ %file,‘r‘,encoding=‘utf-8‘)

    w_str = ‘‘

    for line in file_open:

        if re.search(key,line):

            line = re.sub(key,key_new,line)

            w_str+=line

        else:

            w_str+=line

    file_new_open = open(‘.file‘,‘w‘,encoding=‘utf-8‘)

    file_new_open.write(w_str)

    file_open.close()

    file_new_open.close()

    os.remove(file)

    os.rename(‘.file‘,file)


file(‘db‘,‘dsb‘,‘xiaoming‘)


方法3、

import re,os

def file(file,key,key_new):

    file_open = open(r‘%s‘ %file,‘r‘,encoding=‘utf-8‘)

    w_str = ‘‘

    for line in file_open:

        if re.search(key,line):

            line = re.sub(key,key_new,line)

            w_str+=line

        else:

            w_str+=line

    file_new_open = open(‘.file‘,‘w‘,encoding=‘utf-8‘)

    file_new_open.write(w_str)

    file_open.close()

    file_new_open.close()

    os.remove(file)

    os.rename(‘.file‘,file)

    return ‘acessfull‘


def foo(a,b,c):

    print(a)

    print(b)

    print(c)

    return file(a,b,c)

res = foo(‘db‘,‘小明‘,‘dsb‘)

print(res)


结果:

db

小明

dsb

acessfull


@补充python格式化字符串

格式描述

%%百分号标记 #就是输出一个%

%c字符及其ASCII码

%s字符串

%d有符号整数(十进制)

%u无符号整数(十进制)

%o无符号整数(八进制)

%x无符号整数(十六进制)

%X无符号整数(十六进制大写字符)

%e浮点数字(科学计数法)

%E浮点数字(科学计数法,用E代替e)

%f浮点数字(用小数点符号)

%g浮点数字(根据值的大小采用%e或%f)

%G浮点数字(类似于%g)

%p指针(用十六进制打印值的内存地址)

%n存储输出字符的数量放进参数列表的下一个变量中


        

%格式化符也可用于字典,可用%(name)引用字典中的元素进行格式化输出。


        

负号指时数字应该是左对齐的,“0”告诉Python用前导0填充数字,正号指时数字总是显示它的正负(+,-)符号,即使数字是正数也不例外。


        

可指定最小的字段宽度,如:"%5d" % 2。也可用句点符指定附加的精度,如:"%.3d" % 3。


e.g.

# 例:数字格式化

nYear = 2018

nMonth = 8

nDay = 18

# 格式化日期 %02d数字转成两位整型缺位填0

print  ‘%04d-%02d-%02d‘%(nYear,nMonth,nDay)

>> 2018-08-18# 输出结果


fValue = http://www.mamicode.com/8.123

print ‘%06.2f‘%fValue# 保留宽度为6的2位小数浮点型

>> 008.12# 输出


print ‘%d‘%10# 输出十进制

>> 10

print ‘%o‘%10# 输出八进制

>> 12

print ‘%02x‘%10# 输出两位十六进制,字母小写空缺补零

>> 0a

print ‘%04X‘%10# 输出四位十六进制,字母大写空缺补零

>> 000A

print ‘%.2e‘%1.2888# 以科学计数法输出浮点型保留2位小数

>> 1.29e+00


 格式化操作符辅助指令

符号              作用

*           定义宽度或者小数点精度

-           用做左对齐

+          在正数前面显示加号( + )

<sp>      在正数前面显示空格

#         在八进制数前面显示零(‘0‘),在十六进制前面显示‘0x‘或者‘0X‘(取决于

          用的是‘x‘还是‘X‘)

0        显示的数字前面填充‘0’而不是默认的空格

%           ‘%%‘输出一个单一的‘%‘

(var)    映射变量(字典参数)

m.n       m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)




以下是一些使用格式字符串的例子:

十六进制输出:

>>> "%x" % 108

‘6c‘

>>>

>>> "%X" % 108

‘6C‘

>>>

>>> "%#X" % 108

‘0X6C‘

>>>

>>> "%#x" % 108

‘0x6c‘

浮点数和科学记数法形式输出:

>>>

>>> ‘%f‘ % 1234.567890

‘1234.567890‘

>>>

>>> ‘%.2f‘ % 1234.567890

‘1234.57‘

>>>

>>> ‘%E‘ % 1234.567890

‘1.234568E+03‘

>>>

>>> ‘%e‘ % 1234.567890

‘1.234568e+03‘

>>>

>>> ‘%g‘ % 1234.567890

‘1234.57‘

>>>

>>> ‘%G‘ % 1234.567890

‘1234.57‘

>>>

>>> "%e" % (1111111111111111111111L)

‘1.111111e+21‘

整数和字符串输出:

>>> "%+d" % 4

‘+4‘

>>>

>>> "%+d" % -4

‘-4‘

>>>

>>> "we are at %d%%" % 100

‘we are at 100%‘

>>>

>>> ‘Your host is: %s‘ % ‘earth‘

‘Your host is: earth‘

>>>

>>> ‘Host: %s/tPort: %d‘ % (‘mars‘, 80)

‘Host: mars Port: 80‘

>>>

>>> num = 123

>>> ‘dec: %d/oct: %#o/hex: %#X‘ % (num, num, num)

‘dec: 123/oct: 0173/hex: 0X7B‘

>>>

>>> "MM/DD/YY = %02d/%02d/%d" % (2, 15, 67)

‘MM/DD/YY = 02/15/67‘

>>>

>>> w, p = ‘Web‘, ‘page‘

>>> ‘http://xxx.yyy.zzz/%s/%s.html‘ % (w, p)

‘http://xxx.yyy.zzz/Web/page.html‘


本文出自 “男儿该自强” 博客,请务必保留此出处http://nrgzq.blog.51cto.com/11885040/1949608

python 第三天