骞没蕴 发表于 2018-8-14 07:33:51

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
  importsys
  if len(sys.argv) < 3:
  print('参数不够!')
  elif len(sys.argv) > 3:
  print('参数不对!')
  else:
  with open(r'%s' %sys.argv,'rb') as read_f,open(r'%s' %sys.argv,'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 命令
  importtime
  importsys
  with open(r'%s' %sys.argv,'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
  函数是第一类的对象:指的是函数可以被当做数据传递。
  函数可以当做函数的返回,可以当做容器类型的元素。
  @补充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 = 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'
页: [1]
查看完整版本: python 第三节