本文档主要内容

一 编码

二 集合

三 深浅copy

四 文件操作

五 函数初识

首先,我们来看看两个字符串的比较

  1. 打开cmd,进入dos界面
  2.  
  3. >>>a='xingchen@'
  4.  
  5. >>>b='xingchen@'
  6.  
  7. >>>print(a==b) 结果为 True
  8.  
  9. >>>print(a is b) 结果为 False
  10.  
  11. 上面的两种结果不一样为什么?

这里我们引入id命令,用来测试内存地址

  1. >>> print(id(a))
  2. 2138501550128
  3. >>> print(id(b))
  4. 2138501550184 #可以看出内存地址不一样

自此:== 比较的是值,而is比较的是内存地址

进行第二个实验让 a='xingchen'  b也是b='xingchen'  结果两个都是True

为什么?

小数据池:在str和int中存在这样一个东西,它叫小数据池,即使存在100个这样的变量,在一定范围内,他们都指向同一个内存地址

     存在的意义:节省内存

什么样的范围:对于int  -5 ---- 256

       对于 str:1 不能含有特殊字符,2 单个元素*int 不能超过21

  1.         例如:
  2.           >>> i='a'* 20
  3.           >>> i1='a' * 20
  4.           >>> print(id(i),id(i1))
  5.           2138501554296 2138501554296 #这里是一样的
  6.           又如:
  7.           >>> i='a'* 21
  8.           >>> i1='a' * 21
  9.           >>> print(id(i),id(i1))
  10.           2138501554368 2138501554440 #这里就不一样了

First -------编码

1.1  ascii

  1. 包含数字,字母,特殊字符,它只有两种表示形式01,八个这样的二进制被称为一个字节(byte),
  2.  
  3. ascii一共规定了128个字符的编码,这128个字符只占了这个字节的后七位,最前面的一位为0

1.2 unicode

  1. 万国码,unicode字符集被简成为ucs
  2.  
  3. unicode起初是用两个字节表示一个字符,后来规定一个字符使用的3个或四个字节表示,
  4.  
  5. 这里就产生了问题:无论是简单的英文字符还是复杂的其他字符都用三或四个字节表示,对于存储来说造成了极大浪费,(一个中文使用四个字节表示)。

1.3 utf-8:

  1. utf-8unicode的一种实现方式,其他还有utf-16utf-32;
  2.  
  3. 它采用变长的编码格式,根据情况,可以使用1-4个字节表示,一般英文字符就用一个字节表示,欧洲语言使用两个字节表示,(中文使用三个字节表示)。

1.4 gbk:

  1. 中国大陆制订的,等同于ucs的新的中文编码扩展国家标准,可以表示简体字和繁体字,兼容gb2312

**下面:Unicode,utf-8,gbk,每个编码英文,中文,分别用几个字节表示。

  1.       英文 中文
  2.  
  3. unicode:   4       4
  4.  
  5. utf-8:     1       3
  6.  
  7. gbk:     1       2

其他:

1 不同编码之间的二进制是不能互相识别的
2 对于文件的存储以及传输,不能是unicode的编码(占内存多)。

1.5 bytes和str

在python3.x版本中,有两种类型的字符比较类似

bytes:str拥有的功能,它也有,内部编码方式可以设定,非unicode,可能是utf-8,可能是gbk,可能是gb2312
str(字符串):内部编码方式是unicode,所以不能直接用于文件的存储和传输
str如果要存储: str 转化成--->bytes ---->用于存储和传输
为什么要存在str---因为bytes显示出来的中文没办法识别,只有英文可以,bytes的类型前面有个b,例如b'abcd'

str ---> bytes 使用encode 编码

  1. 例如: s1='xingchen'
  2.     s2='中文'
  3. b1=s1.encode('utf-8')
  4. b2=s1.encode('gbk')
  5. b3=s2.encode('utf-8')
  6. b4=s2.encode('gbk')
  7. print(b1,b2) --->结果为:b'xingchen' b'xingchen' b1b2看着结果一样却是不同的编码
  8. print(b3,b4) ----》结果为:b'\xe4\xb8\xad\xe6\x96\x87' b'\xd6\xd0\xce\xc4' 中文就看出区别了

bytes --->str 使用decode 解码
例如:b1.decode('utf-8')      b2.decode('gbk')

utf-8要向转化成gbk的编码格式:utf-8首先转化成utf-8的bytes类型,再转化成gdk的bytes类型,如果想转化成str的gdk再使用decode

例如:

  1. 例子1
  2. s='中国' #utf-8的str类型
  3. b=s.encode('gbk') #gbk的bytes类型
  4. c=b.decode('gbk') #转化成str的gbk unicode
  5. print(b) #结果为 b'\xd6\xd0\xb9\xfa'
  6. print(c) #结果为 中国
  7.  
  8. 例子2
  9. s2='中文'
  10. d=s2.encode('gbk').decode('gbk')
  11. d1=d.encode('gbk') #转化成gbk的bytes类型,查看编码格式
  12. e=s2.encode('utf-8').decode('utf-8')
  13. e1=e.encode('utf-8') #转化成utf-8的bytes类型,查看编码格式
  14. print(d,d1)
  15. print(e,e1)

pycharm上面使用的是str类型也即是unicode编码,如果从其他地方传过来的文件是utf-8的话,先encode为utf-8的unicode类型,转化成gbk的话再decode('gbk')就好了

pycharm上面的字符串本身就是unicode编码,因此可以直接转化其他编码的bytes类型,例如:str.encode('utf-8')   又如: str.encode('gbk')

********************************所以utf-8的bytes类型转化成gbk的bytes类型 s.encode('utf-8').decode('gbk') 。反之亦然************************************回到页头************************************************

Second ----集合

set1={}
1要求它里面的元素,是可哈希的,str tuple int bool,元素不重复,无序
集合本身是不可哈希的
2 功能:关系测试,去重
例如:
  set1={'a','b','c','d','a'}
  print(set1) #结果为{'b', 'c', 'a', 'd'},再刷新就变成{'a', 'b', 'c', 'd'} #表明是无序的

#将一个列表去重

  1.   l=[1,2,1,3,3,4,5,4]
  2.   print(set(l)) ---》{1, 2, 3, 4, 5}
  3.   print(list(set(l))) --》[1, 2, 3, 4, 5]

集合的--增

  1.   set={'a','b','c'}
  2.   set.add('d')
  3.   print(set)

集合的--删

  1.   set1={1,2,3}
  2.   set.update(set1)
  3.   print(set) #结果为 {1, 'c', 'd', 2, 3, 'b', 'a'}
  4.   set.pop() #随机删除因为无序性
  5.   print(set)
  6.   set.remove('a') #按照元素删除,不存在会报错
  7.   print(set)
  8.   set.clear()
  9.   print(set) # 结果 set()
  10.   del set 只能删除整个集合,del不能切片删除

#没有改,下面是查
集合的---查
# 使用for循环
  for i in set:
  print(i)
不能使用in查

集合的一些用法:
#交集

  1.   set1={1,2,3,4,5}
  2.   set2={4,5,6,7,8}
  3.   print(set1 & set2)
  4.   print(set1.intersection(set2))

#并集
  print(set1 | set2)
  print(set1.union(set2))
#差集,前面独有的元素

  1.   print(set1 - set2)
  2.   print(set2-set1)
  3.   print(set1.difference(set2))

#反交集
  print(set1 ^ set2)
  print(set1.symmetric_difference(set2))
#子集
  set1={1,2,3}
  set2={1,2,3,4,5}
  print(set1 < set2)
  print(set1.issubset(set2))
#超集
  print(set2>set1)
  print(set2.issuperset(set1))
#不可变的集合
  print(frozenset(set1)) ---》frozenset({1, 2, 3})

Third ---深浅copy                                                                   回到页头

  1. s1=[1,2,3]
  2. s2=s1 #赋值,共用一个空间,无论多少层是一样的,一个改变,另外一个也会改变
  3. s1.append(666)
  4. print(s1,s2) ----》[1, 2, 3, 666] [1, 2, 3, 666]
  5.  
  6. s1=[1,2,3]
  7. s2=s1.copy() #浅copy
  8. s1.append(666)
  9. print(s1,s2) ---》[1, 2, 3, 666] [1, 2, 3]
  10.  
  11. s1=[1,2,3,[11,22]]
  12. s2=s1.copy()
  13. s1[-1].append(666)
  14. print(s1,s2) ---》[1, 2, 3, [11, 22, 666]] [1, 2, 3, [11, 22, 666]]

*******所以浅copy第一层各自独立,从第二层开始,共用一个内存地址*****

  1. import copy
  2. s1=[1,2,3,[11,22]]
  3. s2=copy.deepcopy(s1)
  4. s1[-1].append(666)
  5. print(s1,s2) --》[1, 2, 3, [11, 22], 666] [1, 2, 3, [11, 22]]

深copy无论多少层,都是相互独立的

#切片:浅copy

  1.   s1=[1,2,3,[11,22]]
  2.   s2=s1[:]
  3.   # s1.append(666) #结果为 [1, 2, 3, [11, 22], 666] [1, 2, 3, [11, 22]]
  4.   s1[-1].append(666) #结果为[1, 2, 3, [11, 22, 666]] [1, 2, 3, [11, 22, 666]]
  5.   print(s1,s2)

模拟tail -f命令

  1. #tail -f access.log
  2. # import time
  3. # with open(r'xxxxx','rb') as f:
  4. # f.seek(0,2)
  5. # while True:
  6. # line=f.readline()
  7. # # print('===>',line)
  8. # if line:
  9. # print(line.decode(),end='')
  10. # else:
  11. # time.sleep(0.05)

tail -f

Fourth---文件操作

文件路径:path
编码方式:encoding
操作方式:mode: 读,写,读写,写读,追加,改。。。
执行流程:1打开文件,产生文件句柄 2 对文件句柄进行操作 3关闭文件句柄

f1=open(r'b.txt',encoding='utf-8',mode='r')
print(f1.read())
f1.close()

f1文件句柄,open()调用的内置函数,内置函数调用的系统内部open
r'b.txt' 表示文件路径转义,一般加r,或者加一个/转义路径碰到的问题
mode='r' 其中r的模式是默认的

read() 读取文件中的全部内容
read(n)读取一部分内容

对于mode模式,有两种情况

mode='r'

r模式:read(n) 按照字符读取n个字符

rb模式:以bytes方式读取,read(n)按照字节读取n个字节,一个中文一般要读取三个字节,要不然解码的时候会报错

readline() 每次读取一行
readlines() 读取全部内容,但是处在一行,放在一个列表中,以回车(\n)为分隔
for循环读取:每次读取一行

下面是举例说明

写:w
没有文件,新建文件写入内容,
有文件的话--》先清空内容,再写入新内容

  1. f1=open('c.txt',encoding='utf-8',mode='w')
  2. f1.write('呵呵 kjdf')
  3. f1.close()

图片的读取与写入,实现了新复制的图片2 #图片必须使用bytes的类型读取

  1.   f1=open('1.jpg',mode='rb')
  2.   content=f1.read()
  3.   f2=open('2.jpg',mode='wb')
  4.   f2.write(content)
  5.   f1.close()
  6.   f2.close()

追加 a
没有文件,创建文件,类似于w
有文件,在最后追加内容

r+ 读写模式,先读后写,如果先写后读的话,将写的内容覆盖原文件一部分内容,按照字节替换,如果写的内容不是中文字节的3倍将报错,这里指utf-8编码

  1. f1=open('b.txt',encoding='utf-8',mode='r+')
  2. print(f1.read())
  3. f1.write('') #里面只能加入字符串类型的字符
  4. f1.close()
  5.  
  6. f1=open('b.txt',encoding='utf-8',mode='r+')
  7. # print(f1.read())
  8. # f1.write('666') #里面只能加入字符串类型的字符
  9. f1.write('a') #报错
  10. print(f1.read())
  11. f1.close()

w+先写后读,有文件将清空内容,再写入,此时光标在最后,读的是空内容

a+ 先追加再读

操作方法:read readline readlines write
其他操作方法:readable是否可读 writable是否可写
print(f1.tell()) 打印出光标的位置,按照字节显示数字
f1.seek(12) 任意调整光标的位置 --》按照字节移动
f1.seek(0,2) 光标调整到最后
f1.seek(0) 光标调整到开头

f1=open('b.txt',encoding='utf-8',mode='r')
f1.read(3) #按照字符读取
print(f1.tell()) #打印光标的位置是按照字节
f1.close()

f1.truncate(n) 按照字节对源文件进行截取,必须是在 a或 a+,或者r+模式,清空文件内容再将截取的内容放入文件

  1.   f1=open('b.txt',encoding='utf-8',mode='a+')
  2.   f1.truncate(3) #截取了三个字节
  3.   f1.close()

with open('文件路径',encoding='模式') as f1 不用主动关闭文件句柄,可以打开多个文件
with open('c.txt',encoding='utf-8') as f1,\
open('b.txt',encoding='utf-8',mode='w') as f2:
content=f1.read()
f2.write(content)
清空b.txt中的内容,并将c.txt的内容复制到b.txt中

文件的修改:
1 以读的模式打开原文件,以写的模式打开一个新文件(这个文件可以事先不存在)
2 将原文件读出,并按要求修改,并将修改后的内容写入新文件
3 删除原文件
4 将新文件重命名为原文件
例如:

  1.   import os
  2.   with open('b.txt',encoding='utf-8') as f1,\
  3.   open('b.bak',encoding='utf-8',mode='w')as f2:
  4.   for line in f1:
  5.   new_line=line.replace('xingchen','AA')
  6.   f2.write(new_line)
  7.   os.remove('b.txt')
  8.   os.rename('b.bak','b.txt')

例子:文件一次读两行,区别单双行

  1. with open('test-test','r') as f:
  2. content=f.readlines()
  3. p=0
  4. q=2
  5. print(len(content))
  6. while True:
  7. i=content[p:q]
  8. p = p + 2
  9. q = q + 2
  10. x,y=i[:]
  11. print(x.split()[0],y.split()[0])
  12. if q==len(content)+2:
  13. break
  14. elif q==len(content)+1:
  15. i=content[-1]
  16. print(i)
  17. break

Fifth-----函数初识

def 函数名():
函数体
出现return的话,return后面的内容不会执行
**return 等同于 return None 一般None省略

return的返回值有两种:
1 return 可以返回单个值
2 return 可以返回多个值多个值,会将多个值放入一个元组中,将元组返回给函数的执行者
例如:

  1.   def func1():
  2.     print(111)
  3.     print(2222)
  4.     return 666 ,'xingchen',[1,2,3]
  5.   ret=func1()
  6.   print(ret)

实参角度:
位置参数: 必须一一对应
  def func1(a,b,c):
    print(a,b,c)
func1(1,2,'xingchen')

def max(a,b): return a if a>b else b #比较大小的函数

关键字传参:必须一一对应
  def func2(a,b):
    print(a,b)
func2(b=2,a=3)

混合参数:(位置参数和关键字参数)关键字参数必须在位置参数后
  def func2(a,b,c,d):
    print(a,b,c,d)
func2(1,2,d=3,c=5)

形参角度:
位置参数。按顺序一一对应

默认参数。默认参数在位置参数的后面

  1. def login(name,sex='男'):
  2.   with open('register',encoding='utf-8',mode='a') as f1:
  3.   f1.write('{},{}\n'.format(name,sex))
  4.  
  5. while True:
  6. name=input('姓名: ').strip()
  7. if '' in name:
  8.   login(name)
  9.   else:
  10.   sex=input('性别: ').strip()
  11. login(name,sex)

动态参数,*args, **kwargs #函数定义的时候,*代表聚合,**表示关键字参数放入一个字典
args:所有的位置参数,放在一个元组中
kwargs:所有的关键字参数,放在一个字典中

  1.   def func3(*args,**kwargs):
  2.     print(args)
  3.     print(kwargs)
  4. func3(1,2,3,'alex',c=6,name='wu',age='')
  5.  
  6. 结果为:
  7. (1, 2, 3, 'alex')
  8. {'c': 6, 'name': 'wu', 'age': ''}
  9.  
  10. def func3(*args,**kwargs): #函数定义的时候*代表聚合
  11.   print(args)
  12.   print(kwargs)
  13.  
  14. func3(*[1,2,3],*(22,33)) #函数执行的时候,*代表打散,也即是将列表或者列表亦或元组打散为单个的元素
  15. 结果为:(1, 2, 3, 22, 33)
  16. {}
  17.  
  18. func3(**{'name':'xingchen'},**{'age':23})
  19. 结果为
  20. ()
  21. {'name': 'xingchen', 'age': 23}

形参的顺序:位置参数 *args,默认参数,**kwargs
def func5(a,b,*args,sex='男',**kwargs):
  print(a,b)
  print(args)
  print(sex)
  print(kwargs)

                              回到页首

day3----编码-集合-深浅copy-文件操作-函数初识的更多相关文章

  1. python笔记2小数据池,深浅copy,文件操作及函数初级

    小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...

  2. 19-3-8Python中编码的进阶、文件操作初识、深浅copy

    编码的进阶 ASCII:英文字母,数字,特殊符号,——>  二进制的对应关系 Str: 1个字符——> 1个字节 Unicode:万国码:世界上所有的文字与二进制的对应关系 1个字符——& ...

  3. Delphi文件操作函数

    文件是同一种类型元素的有序集合,是内存与外设之间传输数据的渠道.文件的本质是一个数据流,所有的文件实际上是一串二进制序列.文件管理包括:1.文件操作.2.目录操作.3.驱动器操作.三部分. 1.常见文 ...

  4. PHP常用的文件操作函数集锦

    以下是个人总结的PHP文件操作函数.当然,这只是部分,还有很多,我没有列出来. 一 .解析路径: 1 获得文件名:basename();给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件 ...

  5. 常用PHP文件操作函数

    注:文件操作函数的行为受到 php.ini 中设置的影响. 当在 Unix 平台上规定路径时,正斜杠 (/) 用作目录分隔符.而在 Windows 平台上,正斜杠 (/) 和反斜杠 (\) 均可使用. ...

  6. 总结文件操作函数(二)-C语言

    格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf( ...

  7. C语言样式的文件操作函数

    使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...

  8. Unix无缓冲文件操作函数、文件信息查询

    问题描述:         Unix无缓冲文件操作函数.文件信息查询 问题解决:        struct stat 结构体信息: 具体代码: 具体源文件:

  9. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

随机推荐

  1. Zookeeper Ha集群简介+jdbcClient访问Ha集群环境

    Hadoop-HA机制HA概述high available(高可用) 所谓HA(high available),即高可用(7*24小时不中断服务). 实现高可用最关键的策略是消除单点故障.HA严格来说 ...

  2. Qt 中的事件处理(一)

    1.图形界面应用程序的消息处理模型 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的 系统内核的消息通过事件处理转变成QT的信号 2. Qt中 ...

  3. HTML:meta标签使用总结 [转载] [360浏览器 指定极速模式]

    meta标签作用 META标签是HTML标记HEAD区的一个关键标签,提供文档字符集.使用语言.作者等基本信息,以及对关键词和网页等级的设定等,最大的作用是能够做搜索引擎优化(SEO). PS:便于搜 ...

  4. RedHat6.5安装zookeeper单机

    版本号: Redhat6.5  zookeeper-3.4.6  JDK1.8 zookeeper下载 官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apac ...

  5. Cordova+Angularjs+Ionic 混合开发入门讲解

    作为一名学习Android开发的学生,对于移动开发的发展趋势颇为关注,大家都知道,现在原生的移动开发在企业上基本很少使用了,大部分企业为了降低成本,选择了webapp,hybrid(混合开发)这两种模 ...

  6. mvc 缓存 sqlCacheDependency 监听数据变化

    mvc 缓存   对于MVC有Control缓存和Action缓存. 一.Control缓存 Control缓存即是把缓存应用到整个Control上,该Control下的所有Action都会被缓存起来 ...

  7. jquery 中prop和 attr

    prop就是给html中元素固有的属性赋值 而attr是给元素定义新的属性值.

  8. VUEX 学习

    语法   翻译  功能介绍 module(模块)extend(扩展)extract(提取)export(输出)router(路由器)components(组件) store(储存)state (声明. ...

  9. python3学习笔记一(标识符、关键字)

    查看Python版本 可以命令窗口,windows使用win+R调出cmd运行框,输入以下命令: python -V 进入python的交互编辑模式,也可查看 D:\Python3.6\Scripts ...

  10. Hadoop概念学习系列之Hadoop、Spark学习路线(很值得推荐)(十八)

    不多说,直接上干货! 说在前面的话 此笔,对于仅对于Hadoop和Spark初中学者.高手请忽略! 1 Java基础: 视频方面:          推荐<毕向东JAVA基础视频教程>.学 ...