今日概要

    - 编码详解

    - 文件操作

    - 初识函数

一、字符编码

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) #'\xe6\x9e\x98' 三个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\n'
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)

 

  

python自动化开发-[第三天]-编码,函数,文件操作的更多相关文章

  1. Python全栈之路4--内置函数--文件操作

    上节重点回顾: 判断对象是否属于某个类,例如: 列表中有个数字,但是循环列表判断长度,用len会报错;因为int不支持len,所以要先判断属于某个类,然后再进行if判断. # isinstance(对 ...

  2. python自动化--语言基础三字典、函数、全局/局部变量

    字典 dict1 = {,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values()) #打印所有的values值 pri ...

  3. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  4. Python自动化开发

    阅读目录 第一篇:python入门 第二篇:字符编码.文件处理 第三篇:函数 第四篇:迭代器.生成器.三元表达式.列表生成式 第五篇:模块.包.软件开发规范 第六篇:日志模块 第七篇:常用模块 第八篇 ...

  5. python自动化开发学习 I/O多路复用

    python自动化开发学习 I/O多路复用   一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...

  6. JS三个编码函数和net编码System.Web.HttpUtility.UrlEncode比较

    JS三个编码函数和net编码比较 总结 1.escape.encodeUri.encodeUriComponent均不会对数字.字母进行编码.2.escape:对某些字符(如中文)进行unicode编 ...

  7. Python爬虫与数据分析之进阶教程:文件操作、lambda表达式、递归、yield生成器

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  8. Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数

    1.        集合 1.1      特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...

  9. Python自动化开发 - 字符编码、文件和集合

    本节内容 字符编码 文件操作 集合 一.字符编码 1.编码 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.解决思路:数字与符号建立一对一映射,用不同数字表示不同符号. ASCI ...

随机推荐

  1. Previous Workflow Versions in Nintex Workflow

    Previous Workflow Versions in Nintex Workflow September 4, 2013 It occurred to me that even though I ...

  2. EOS搭建

    http://mp.weixin.qq.com/s/RcDFCFCWpMIIAshJMqkxxw ,地址实效,请关注公众号 一下引用,只是技术记录交流 目前来讲,学习任何EOS相关技术的资料都来自ht ...

  3. 在idea中设置记住git的用户名和密码

    在idea中设置记住git的用户名和密码 1.在项目根目录下执行以下git命令: git config --global credential.helper store 2.执行上述命令后,在idea ...

  4. BZOJ2038[2009国家集训队]小Z的袜子(hose)——莫队

    题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号 ...

  5. BZOJ3224普通平衡树——旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  6. 区间DP,数位DP

    dp(动态规划)顾名思义便是动态的一种规划,而这种规划往往会跟状态,状态转移方程,记忆化搜索扯上关系,当然DP也是各个OI考试的必考点和常考点,在毒瘤出题人的折磨下,出现了许许多多的动态规划,有线性, ...

  7. Codeforces510 C. Fox And Names

    Codeforces题号:#510C 出处: Codeforces 主要算法:判环+拓扑 难度:4.2 思路分析: 要是把这道题联系到图上就很容易想了. 如何建图?由于最后要求名字满足字典序,所以不妨 ...

  8. python通过配置文件连接数据库

    今天主要是通过读取配置文件(ini文件)获取数据库表的ip,端口,用户,密码,表名等,使用pysql来操作数据库,具体的ini配置文件的操作参见我另一篇博客:https://www.cnblogs.c ...

  9. Hdoj 2501.Tiling_easy version 题解

    Problem Description 有一个大小是 2 x n 的网格,现在需要用2种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法. Input 输入的第 ...

  10. 【BZOJ5303】[HAOI2018]反色游戏(Tarjan,线性基)

    [BZOJ5303][HAOI2018]反色游戏(Tarjan,线性基) 题面 BZOJ 洛谷 题解 把所有点全部看成一个\(01\)串,那么每次选择一条边意味着在这个\(01\)串的基础上异或上一个 ...