首页 > 代码库 > 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 第三天