【澳门新葡新京】python数据类型使用,编制程序语言与Python学习

一、数字类型使用

1.1 流程控制之for循环

1 迭代式循环:for,语法如下 

for i in range(10):



    缩进的代码块

 

 

2 break与continue(同上)

3 循环嵌套

for i in range(1,10):

    for j in range(1,i+1):

        print('%s*%s=%s' %(i,j,i*j),end=' ')

    print()



for+else

 

 

可变与不可变类型

  • 可变:在值改变的情况,如果id不变,证明就是在修改原值,即可变类型

  • 不可变:在值改变的情况,如果id也跟着变,证明根本没有修改原值,即不可变类型

1.2 开发工具IDE

int基本使用

1.2.1 为何要用IDE

到现在为止,我们也是写过代码的人啦,但你有没有发现,每次写代码要新建文件、写完保存时还要选择存放地点,执行时还要切换到命令行调用python解释器,好麻烦呀,能否一气呵成,让我简单的写代码?此时开发工具IDE上场啦,一个好的IDE能帮你大大提升开发效率。

很多语言都有比较流行的开发工具,比如JAVA 的Eclipse,
C#,C++的VisualStudio, Python的是啥呢? Pycharm,最好的Python 开发IDE

1.常用操作+内置方法

  算数运算,比较运算

1.2.2 安装

下载地址: 选择Professional
专业版 

Comunnity社区版是免费的,但支持的功能不多,比如以后我们会学的Django就不支持,所以还是用专业版,但专业版是收费的,一年一千多,不便宜。唉,万能的淘宝。。。不宜再多说啦。

 注册完成后启动,会让你先创建一个项目,其实就是一个文件夹,我们以后的代码都存在这里面

 澳门新葡新京 1

 

图1-1  

2.该类型总结

  • 存一个值
  • 不可变类型

 x=10 print(id(x)) x=11 print(id(x)) 

1.2.3 创建目录

你以后写的项目可能有成百上千个代码文件
,全放在一起可不好,所以一般把同样功能的代码放在一个目录,我们现在以天为单位,为每天的学习创建一个目录day1,day2,day3…这样

 澳门新葡新京 2

 

图1-2  

float基本使用

1.2.4 创建代码文件

 澳门新葡新京 3

 

图1-3  

1.常用操作+内置方法

  算法运算,比较运算

1.2.5 执行代码

 澳门新葡新京 4

 

图1-4  

 

2.该类型总结

  • 存一个值
  • 不可变类型

 x=10.1 print(id(x)) x=11.1 print(id(x)) 

 

1.3 数据

二、字符串使用

1.3.1 什么是数据?

  x=10,10是我们要存储的数据

 

二、一 str基本使用

1.3.2 为何数据要分不同的类型

  数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示

1.常用操作+内置方法

1.1 按索引取值(正向取+反向取):只能取   

msg="hello world"
print(msg[1])
print(msg[5])
print(msg[-1])
print(msg[-3])

1.2 切片:从一个大字符串中切除一个子字符串(顾头不顾尾,步长)

msg="hello world"
print(msg[1:3])
print(msg[6:11])
print(msg[6:11:2]) #world #wrd

# 倒着取值(了解):注意方向要一致
print(msg[6:])
print(msg[-1:-6:-1])
print(msg[-1::-1])
print(msg[::-1])

1.3 长度len

 msg=”hello
world” print(len(msg)) #
长度是11,索引最大到10 

 

1.4 成员运算in 和not in : 判断一个子字符串是否存在于一个大字符串中

msg="hello world hello momo"
print('momo' in msg)
print('world' in msg)
print('hello' not in msg)
print(not 'hello' in msg)

1.5 移除空白strip

msg='     mogu       '
res=msg.strip() # 默认去除的是字符串左右两边的空格
print(msg)
print(res)

# strip会从左往右开始吃空格,直到碰到一个非空格为止
# 右面相同的原理
#ps:strip并没有修改原值,是产生一个新值

msg='******mo****gu*****'
print(msg.strip('*'))

msg='-&!^%aaaa-!&^%'
print(msg.strip('!-&^%'))

1.6 切分split :把一个字符串按照某种分隔符切成一个列表

info='root:x:0:0:admin user:/root:/bin/bash'
res=info.split(':',maxsplit=-1)
print(res,type(res))
print(res[0])

l=['mogu',123,'chimogu']
s1=':'.join(l) #把列表又转成了字符串(前提是列表中所有元素均为字符串)
print(s1,type(s1))

1.7 循环

  while循环取值

1 msg='hello world'
2 i=0
3 while i < len(msg):
4     print(msg[i])
5     i+=1

  for循环取值

msg='hello world'
for item in msg:
    print(item)

1.8 大小写切换

# 2、lower,upper
print('aaAbCCC'.lower())
print('aaAbCCC'.upper())

1.9 判断以什么开头(startswith),什么结尾(endswith)

print('xiaomogu  like  mogu'.startswith('xiao'))
print('xiaomogu  like  mogu'.endswith('gu'))

1.10 格式化输出format

print('my name is %s my age is %s' %(18,'mogu'))
print('my name is {name} my age is {age}'.format(age=18,name='mogu'))

print('my name is {} my age is {}'.format(18,'mogu'))
print('my name is {0}{0}{0} my age is {1}'.format(18,'mogu'))

1.11 replace 替换操作

msg='my name is xiaomogu,xiaomogu say hello'
print(msg.replace('xiaomogu','xiaonvhai',1))

1.12 isdigit:只有在字符串中包含纯数字的情况下结果才为True

print('10123'.isdigit())

1.13 其他了解的知识点

#center,ljust,rjust,zfill

分别对应中央位  左对齐   右对齐   右对齐以0为占位符
print('**************%s*************************'  %'mogu')
print('mogu'.center(50,'*'))
print('mogu'.ljust(50,'='))
print('mogu'.rjust(50,'-'))
print('mogu'.rjust(50,'0'))
print('mogu'.zfill(50))

# expandtabs     end=' ' 取消print默认的换行符\n
print('aaabbbb',end='     ')
print('cccc',end='')
print('aaaa\nbbbb',end='')
print('aaa\tbbb'.expandtabs(tabsize=3))

#\n 代表换行符  \t  代表tab键 (制表符)

1.3.3 数据类型

l  数字(整形,长整形,浮点型,复数)

l  字符串

l  字节串:在介绍字符编码时介绍字节bytes类型

l  列表

l  元组

l  字典

l  集合

 

二、二 :该类型总结

  • 存一个值
  • 有序
  • 不可变

1.4 数字

整型与浮点型

复制代码

#整型int

  作用:年纪,等级,身份证号,qq号等整型数字相关

  定义:

    age=10 #本质age=int(10)

#浮点型float

  作用:薪资,身高,体重,体质参数等浮点数相关

    salary=3000.3 #本质salary=float(3000.3)

#二进制,十进制,八进制,十六进制

复制代码

其他数字类型(了解)

复制代码

#长整形(了解)

    在python2中(python3中没有长整形的概念):      

   >>> num=2L

    >>> type(num)

    <type 'long'>

 

 

三、列表使用

1.5 字符串

#作用:名字,性别,国籍,地址等描述信息

 

#定义:在单引号\双引号\三引号内,由一串字符组成

name=’egon’

#优先掌握的操作:

#1、按索引取值(正向取+反向取) :只能取

#2、切片(顾头不顾尾,步长)

#3、长度len

#4、成员运算in和not in

#5、移除空白strip

#6、切分split

#7、循环  

 

list基本使用

list类型转换的工作原理:list(items)
  1、先造一个空列表
  2、类似调用了一个for循环,从items里取出一个值放入空列表中,循环往复直到取干净为止

1.常用操作+内置方法

  1.1 按索引存取值(正向存取+反向存取):即可以取也可以改
    ps:不能根据索引往列表里新加入值

l=['a','b','c','d']
print(l[3])
print(l[-1])
l[3] = 'D'
print(l)

 1.2 切片:从一个大列表中切出一个子列表(顾头不顾尾,步长)

l=['a','b','c','d']
l1=l[1:3]
print(l1)

 1.3 len 长度

print(len(l))

    1.4 成员运算in和not in

names=['mogu','nvhai','huochai',1,3,4]
print(4 in names)
print(5 not in names)

    1.5 追加、插入

##append 追加值(放到末尾)    insert(索引,值)
l=['a','b','c','d']
l.append('aaa')
print(l)
l.insert(0,'B') #['B', 'a', 'b', 'c', 'd']
l.insert(0,'mogu')
print(l)

    1.6 删除

l=['a','b','mogu','d']
del l[2] # 非字符串独有的删除,是一种通用的删除方式  del
print(l)
res=l.remove('alex') # 单纯的删除,没有返回值    remove
print(l)
print(res)

#pop   从列表中拿走一个值:
#          1、删除一个元素
#          2、将该元素当做返回值返回       
res=l.pop() # 默认从最后一个删除
print(l)
print(res)
res=l.pop(2)
print(res)

   1.7 循环

l=['a','b','c']
for item in l:  #循环取值
    print(item)

   1.8 需要掌握的操作

澳门新葡新京 5澳门新葡新京 6

l1=[1,2.3,'a','a','b','a']
print(l1.count('a'))   #count  次数

l2=[4,5,6]
l1.append(l2[0])
l1.append(l2[1])
l1.append(l2[2])#append到l1的末尾

l1.extend(l2)#extend  把多个值往末尾放
print(l1)

l1=[1,2.3,'a','a','b','a']
l1.index('egon')  # index  查找   找不到会报错
print(l1.index('a',0,3))

names=['mogu','nvhai','huochai']
names.reverse()  #reverse  将列表翻转
print(names)

nums=[9,3,4,-1,5,100,98]
nums.sort() # 默认从小到大排序 sort
nums.sort(reverse=True) # 翻转过来从大到小排序
print(nums)

其他需要掌握的操作

   1.9 队列与堆栈

澳门新葡新京 7澳门新葡新京 8

#队列:先进先出
l=[]
# 入队
l.append('first')
l.append('second')
l.append('third')

print(l)
# 出队
print(l.pop(0))
print(l.pop(0))
print(l.pop(0))

队列

澳门新葡新京 9澳门新葡新京 10

# 堆栈:先进后出
l=[]
# 入栈
l.append('first')
l.append('second')
l.append('third')

print(l)
# 出栈
print(l.pop(-1))
print(l.pop(-1))
print(l.pop(-1))

堆栈

1.5.1 需要掌握的操作

复制代码

#1、strip,lstrip,rstrip

#2、lower,upper

#3、startswith,endswith

#4、format的三种玩法

#5、split,rsplit

#6、join

#7、replace

#8、isdigit

 

#strip

name='*egon**'

print(name.strip('*'))

print(name.lstrip('*'))

print(name.rstrip('*'))

 

 

#lower,upper

name='egon'

print(name.lower())

print(name.upper())

 

 

#startswith,endswith

name='alex_SB'

print(name.endswith('SB'))

print(name.startswith('alex'))

 

 

#format的三种玩法

res='{} {} {}'.format('egon',18,'male')

res='{1} {0} {1}'.format('egon',18,'male')

res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)

 

 

#split

name='root:x:0:0::/root:/bin/bash'

print(name.split(':')) #默认分隔符为空格

name='C:/a/b/c/d.txt' #只想拿到顶级目录

print(name.split('/',1))

 

 

name='a|b|c'

print(name.rsplit('|',1)) #从右开始切分

 

 

#join

tag=' '

print(tag.join(['egon','say','hello','world'])) #可迭代对象必须都是字符串

澳门新葡新京, 

 

#replace

name='alex say :i have one tesla,my name is alex'

print(name.replace('alex','SB',1))

 

 

#isdigit:可以判断bytes和unicode类型,是最常用的用于于判断字符是否为”数字”的方法

age=input('>>: ')

print(age.isdigit())

 

2.总结list

  • 存多个值
  • 有序
  • 可变类型

1.6 列表

#作用:多个装备,多个爱好,多门课程,多个女朋友等

#定义:[]内可以有多个任意类型的值,逗号分隔

my_girl_friends=['alex','wupeiqi','yuanhao',4,5] #本质my_girl_friends=list([...])

 

l=list('abc')

 

#优先掌握的操作:

#1、按索引存取值(正向存取+反向存取):即可存也可以取     

#2、切片(顾头不顾尾,步长)

#3、长度

#4、成员运算in和not in

#5、追加

#6、删除

#7、循环

 

#ps:反向步长

l=[1,2,3,4,5,6]

 

 

#正向步长

l[0:3:1] #[1, 2, 3]

 

#反向步长

l[2::-1] #[3, 2, 1]

 

#列表翻转

l[::-1] #[6, 5, 4, 3, 2, 1]

 

 

 

 

四、元组使用(不可变列表)

1.7 元组

#作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读

 

#定义:与列表类型比,只不过[]换成()

age=(11,22,33,44,55)本质age=tuple((11,22,33,44,55))

 

 

#优先掌握的操作:

#1、按索引取值(正向取+反向取):只能取  

#2、切片(顾头不顾尾,步长)

#3、长度

#4、成员运算in和not in

#5、循环

 

#简单购物车,要求如下:

实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入  

msg_dic={

'apple':10,

'tesla':100000,

'mac':3000,

'lenovo':30000,

'chicken':10,

}

 

 

msg_dic={

'apple':10,

'tesla':100000,

'mac':3000,

'lenovo':30000,

'chicken':10,

}

goods_l=[]

while True:

    for key,item in msg_dic.items():

        print('name:{name} price:{price}'.format(price=item,name=key))

    choice=input('商品>>: ').strip()

    if not choice or choice not in msg_dic:continue

    count=input('购买个数>>: ').strip()

    if not count.isdigit():continue

    goods_l.append((choice,msg_dic[choice],count))



    print(goods_l)

 

 

 

tuple基本使用

  元组的定义:不可变的列表  ,用( )内用逗号分隔开多个任意类型的元素

t=('a',1,3.3) #t=tuple(('a',1,3.3))
print(t,type(t))     #class   tuple

1.8 字典

#作用:存多个值,key-value存取,取值速度

#定义:key必须是不可变类型,value可以是任意类型

info={'name':'egon','age':18,'sex':'male'} #本质info=dict({....})

 

info=dict(name='egon',age=18,sex='male')

 

info=dict([['name','egon'],('age',18)])

 

{}.fromkeys(('name','age','sex'),None)

 

 

#优先掌握的操作:

#1、按key存取值:可存可取

#2、长度len

#3、成员运算in和not in

#4、删除

#5、键keys(),值values(),键值对items()

#6、循环

1 有如下值集合 [11,22,33,44,55,66,77,88,99,90…],将所有大于 66
的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中

 

即: {‘k1’: 大于66的所有值, ‘k2’: 小于66的所有值}

 

a={'k1':[],'k2':[]}

c=[11,22,33,44,55,66,77,88,99,90]

for i in c:

    if i>66:

        a['k1'].append(i)

    else:

        a['k2'].append(i)

print(a)

 

 

 

2 统计s=’hello alex alex say hello sb sb’中每个单词的个数

结果如:{‘hello’: 2, ‘alex’: 2, ‘say’: 1, ‘sb’: 2}

s=’hello alex alex say hello sb sb’

 

l=s.split()

dic={}

for item in l:

    if item in dic:

        dic[item]+=1

    else:

        dic[item]=1

print(dic)



s='hello alex alex say hello sb sb'

dic={}

words=s.split()

print(words)

for word in words: #word='alex'

    dic[word]=s.count(word)

    print(dic)

 

 

 

 

#利用setdefault解决重复赋值

”’

setdefault的功能

1:key存在,则不赋值,key不存在则设置默认值

2:key存在,返回的是key对应的已有的值,key不存在,返回的则是要设置的默认值

d={}

print(d.setdefault('a',1)) #返回1

 

 

d={'a':2222}

print(d.setdefault('a',1)) #返回2222

'''

s='hello alex alex say hello sb sb'

dic={}

words=s.split()

for word in words: #word='alex'

    dic.setdefault(word,s.count(word))

    print(dic)

 

 

#利用集合,去掉重复,减少循环次数

s='hello alex alex say hello sb sb'

dic={}

words=s.split()

words_set=set(words)

for word in words_set:

    dic[word]=s.count(word)

    print(dic)

 

 

1. 常用操作+内置方法

 1.1  按索引取值(正向取+反向取):只能取 

t1=tuple('hello') # 任意可以被for循环的数据类型都可以被tuple转成元组
print(t1,type(t1))

t1=('hello','world') # 任意可以被for循环的数据类型都可以被tuple转成元组
print(t1,type(t1))
print(t1[1])

 1.2  切片(顾头不顾尾)

t1=(1,2,3,4,5)
print(t1[0:3])

 1.3 长度len

  与列表操作一致

 1.4 循环

  与列表操作一致

1.9 集合

#作用:去重,关系运算,

#定义:

            知识点回顾

            可变类型是不可hash类型

            不可变类型是可hash类型

#定义集合:

            集合:可以包含多个元素,用逗号分割,

            集合的元素遵循三个原则:

             1:每个元素必须是不可变类型(可hash,可作为字典的key)

             2:没有重复的元素

             3:无序

注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值

 

优先掌握的操作:

#1、长度len

#2、成员运算in和not in

 

#3、|合集

#4、&交集

#5、-差集

#6、^对称差集

#7、==

#8、父集:>,>=

#9、子集:<,<=  

 

.关系运算

  有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合

  pythons={‘alex’,’egon’,’yuanhao’,’wupeiqi’,’gangdan’,’biubiu’}

  linuxs={‘wupeiqi’,’oldboy’,’gangdan’}

  1. 求出即报名python又报名linux课程的学员名字集合

  2. 求出所有报名的学生名字集合

  3. 求出只报名python课程的学员名字

  4. 求出没有同时这两门课程的学员名字集合

#
有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合

pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}

linuxs={'wupeiqi','oldboy','gangdan'}

 

# 求出即报名python又报名linux课程的学员名字集合

print(pythons & linuxs)

 

# 求出所有报名的学生名字集合

print(pythons | linuxs)

 

# 求出只报名python课程的学员名字

print(pythons - linuxs)

 

# 求出没有同时这两门课程的学员名字集合

print(pythons ^ linuxs)

 

 

去重

 

   1.
有列表l=[‘a’,’b’,1,’a’,’a’],列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序

   2.在上题的基础上,保存列表原来的顺序

   3.去除文件中重复的行,肯定要保持文件内容的顺序不变

  
4.有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序

l=[

    {'name':'egon','age':18,'sex':'male'},

    {'name':'alex','age':73,'sex':'male'},

    {'name':'egon','age':20,'sex':'female'},

    {'name':'egon','age':18,'sex':'male'},

    {'name':'egon','age':18,'sex':'male'},

]  

#去重,无需保持原来的顺序

l=['a','b',1,'a','a']

print(set(l))

 

 

#去重,并保持原来的顺序

#方法一:不用集合

l=[1,'a','b',1,'a']



l1=[]

for i in l:

    if i not in l1:

        l1.append(i)

print(l1)

 

#方法二:借助集合

l1=[]

s=set()

for i in l:

    if i not in s:

        s.add(i)

        l1.append(i)



print(l1)

 

 

#同上方法二,去除文件中重复的行

import os

with open('db.txt','r',encoding='utf-8') as read_f,\

        open('.db.txt.swap','w',encoding='utf-8') as write_f:

    s=set()

    for line in read_f:

        if line not in s:

            s.add(line)

            write_f.write(line)

os.remove('db.txt')

os.rename('.db.txt.swap','db.txt')

 

 

#列表中元素为可变类型时,去重,并且保持原来顺序

l=[

    {'name':'egon','age':18,'sex':'male'},

    {'name':'alex','age':73,'sex':'male'},

    {'name':'egon','age':20,'sex':'female'},

    {'name':'egon','age':18,'sex':'male'},

    {'name':'egon','age':18,'sex':'male'},

]

 

# print(set(l)) #报错:unhashable type: ‘dict’

s=set()

l1=[]

for item in l:

    val=(item['name'],item['age'],item['sex'])

    if val not in s:

        s.add(val)

        l1.append(item)



print(l1)

  

 

#定义函数,既可以针对可以hash类型又可以针对不可hash类型

def func(items,key=None):

    s=set()

    for item in items:

        val=item if key is None else key(item)

        if val not in s:

            s.add(val)

            yield item



print(list(func(l,key=lambda dic:(dic['name'],dic['age'],dic['sex']))))

 

 

2.该类型总结

  • 存多个值
  • 有序
  • 不可变类型  
  • ps
    :元组可变指的元组内索引对应的内存地址不变,列表可变指的列表内索引对应的内存地址可以改变

1.10 数据类型总结

按存储空间的占用分(从低到高)

 

数字

字符串

集合:无序,即无序存索引相关信息

元组:有序,需要存索引相关信息,不可变

列表:有序,需要存索引相关信息,可变,需要处理数据的增删改

字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改

按存值个数区分

 

标量/原子类型       数字,字符串

容器类型            列表,元组,字典

 

按可变不可变区分

可变        列表,字典

不可变    数字,字符串,元组

 

按访问顺序区分

直接访问                  数字

顺序访问(序列类型)    字符串,列表,元组

key值访问(映射类型)  字典

 

五、字典使用

1.11 运算符

身份运算(is ,is not)

is比较的是id,而双等号比较的是值

毫无疑问,id若相同则值肯定相同,而值相同id则不一定相同

>>> x=1234567890

>>> y=1234567890

>>> x == y

True

>>> id(x),id(y)

(3581040, 31550448)

>>> x is y

False

 

 

dict基本使用

  字典用途是存多个种类不同的值,在{ }
内用逗号分隔开多个元素,每一个元素都是key:value的形式,key应该对value有描述性的功能

  ps:注意:value可以是任意类型,而key必须是不可变类型且唯一

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'    
}    

1.12 字符编码

1.常用操作+内置方法

  1.1 按key存取值:可存可取

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
print(id(name_dic))
name_dic['age']=20
print(id(name_dic))
print(name_dic)

  1.2 长度len

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
print(len(name_dic))

  1.3 成员运算in 和not in :判断的是字典的key

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
print('age'in name_dic)

  1.4 删除

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
res=name_dic.pop('hobby')   #删除key对应的元素,返回value值
print(res)

  1.5 键keys() ,值values() , 键值对 items()

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
print(name_dic.keys())
print(name_dic.values())
print(name_dic.items())

print(list(name_dic.keys()))
print(list(name_dic.values()))
print(list(name_dic.items()))

  1.6 循环

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
for k in name_dic.keys():
    print(k)

for k in name_dic:
    print(k,name_dic[k])

for v in name_dic.values():
    print(v)

for k,v in name_dic.items(): #k,v=('name', 'egon')
    print(k,v)

  1.7 get 取值

name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
res=name_dic.get('sex',None)
print(res)  #None

res1=name_dic.get('name',None)
print(res1)  #xiaomogu

  1.8 其他操作

# 需要掌握
name_dic={
       'name':'xiaomogu',
       'age':19,
       'hobby':'learning'
}
res=name_dic.popitem()
print(name_dic,res)  #{'name': 'xiaomogu', 'age': 19} ('hobby', 'learning')

name_dic.update({'x':1,'height':1.78}) # 老字典d没有的则添加,有的则以新字典为准进行修改
print(name_dic) #{'name': 'xiaomogu', 'age': 19, 'x': 1, 'height': 1.78}

1.12.1 操作系统基础

 

图1-5  

 

2. 该类型总结

  • 存多个值
  • 无序
  • 可变类型

1.12.2 文本编辑器存取文件的原理(nodepad++,pycharm,word)

#1、打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失

#2、要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上。

#3、在我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已。

 

六、集合的使用

1.12.3 python解释器执行py文件的原理 ,例如python test.py

#第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器

#第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中(小复习:pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名)

#第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码(
ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码,当执行到name=”egon”时,会开辟内存空间存放字符串”egon”)

 

set基本使用

  集合用于:1.去重  2 .关系运算

s={1,2,1,1,1,1,1,1,1} #s=set({1,2})
print(type(s))
print(s)

1.12.4 总结python解释器与文件本编辑的异同

#1、相同点:python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样

#2、不同点:文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法。

 

1.常用操作+内置方法

  1.1 关系运算

澳门新葡新京 11澳门新葡新京 12

#关系运算
english_class={'xiaomogu','xiaohuochai','张三','张四','李五','关二爷'}
computer_class={'xiaomomo','xiaohuochai','张三','mogu','李五','xiaomogu'}
# 1.1、求既报名English又报名computer的学生有哪些->即求两个集合体的共同部分,称之为交集
print(english_class & computer_class)  #{'李五', 'xiaomogu', '张三', 'xiaohuochai'}
#1.2、求只报名English,没有报名computer的学生有哪些->即求English减去computer,称之为差集
print(english_class - computer_class)  #{'张四', '关二爷'}
#1.3、求只报名computer,没有报名English的学员有哪些
print(computer_class - english_class) #{'xiaomomo', 'mogu'}
#1.4 求所有报名的学生姓名->即求两个集合体的总和,称之为并集
print(english_class | computer_class) #{'xiaohuochai', 'mogu', '张四', 'xiaomogu', '张三', '李五', 'xiaomomo', '关二爷'}
#1.5 求没有同时报名两门课程的学生姓名->称之为对称差集
print(english_class ^ computer_class)  #{'关二爷', '张四', 'xiaomomo', 'mogu'}

# 1.6 ==
s1={1,2,3}
s2={3,2,1}
print(s1 == s2)

# 注意:只有在两个集合存在包含与被包含的关系时才可以进行大小的比较
# 1.7、父集:>,>=
s1={1,2,3}
s2={1,2}
print(s1 > s2) # s1是s2的父集
print(s1 >= s2) # s1是s2的父集

print(s1.issuperset(s2)) #s1 >= s2

s3={1,2,3}
s4={3,4,5,6}

print(s4 >= s3)
# 1.8、子集:<,<=
print(s2.issubset(s1)) #s2 <= s1

print(len({1,2,3}))
print(1 in {1,2,3})

集合的关系运算

澳门新葡新京 13澳门新葡新京 14

# 集合其他的内置方法
s1={1,2,3,4,5}
print(id(s1))
s1.add(6)
print(s1)
print(id(s1))

s2={3,4}
s1.difference_update(s2) ## s1=s1.difference(s2) #s1=s1 - s2
print(s1)

s3={6,7}
print(s1.isdisjoint(s3))

 # 删除
print(s1.pop()) # 随机删除
s1.discard(333333) # 指定元素删除,,如果元素不存在也不报错
s1.remove(3333) # 指定元素删除,如果元素不存在则报错
print(s1)

s1={1,2,3,4,5}
s1.update({3,4,5,6,7})
s1.update('hello')
print(s1)

集合的内置方法

  1.2 去重

    局限性:1.不能保证原来的顺序   2.不能针对可变类型去重

澳门新葡新京 15澳门新葡新京 16

l=[1,1,1,1,'mogu','xiaohuochai','mogu']
s=set(l) #{1,'egon','alex'}
print(s)

l=list(s) #[]
print(l)

集合去重

澳门新葡新京 17澳门新葡新京 18

# 需求:
#1、列表内的元素有可变类型
#2、去重之后要保持原来顺序
info=[
    {'name':'xiaomogu','age':18},
    {'name':'momo','age':23},
    {'name':'xiaonvhai','age':17},
    {'name': '张三', 'age': 46},
    {'name':'李四','age':52},
    {'name':'xiaomogu','age':18},
]
d=[]
for dic in info:
    if dic not in d:
        d.append(dic)
info=d
print(info)

列表内可变元素去重方法

  1.3 循环

s={'xiaomogu','momo','xiaonvhai','xiaohuochai'}
for item in s:
    print(item)

1.13 字符编码介绍

 

1.13.1 什么是字符编码

复制代码

  计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。电的特性即高低电平(人类从逻辑上将二进制数1对应高电平,二进制数0对应低电平),关于磁盘的磁特性也是同样的道理。结论:计算机只认识数字

  很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?

  必须经过一个过程:

  #字符——–(翻译过程)——->数字

  #这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码

以下两个场景下涉及到字符编码的问题:

#1、一个python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(python文件并未执行,前两个阶段均属于该范畴)

#2、python中的数据类型字符串是由一串字符组成的(python文件执行时,即第三个阶段)

七、字符编码

1.13.2 字符编码的发展史与分类

计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用
8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256
个符号

 

图1-6  

当然我们编程语言都用英文没问题,ASCII够用,但是在处理数据时,不同的国家有不同的语言,日本人会在自己的程序中加入日文,中国人会加入中文。

而要表示中文,单拿一个字节表表示一个汉子,是不可能表达完的(连小学生都认识两千多个汉字),解决方法只有一个,就是一个字节用>8位2进制代表,位数越多,代表的变化就多,这样,就可以尽可能多的表达出不通的汉字,所以中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符->数字的对应关系。

日本人规定了自己的Shift_JIS编码,韩国人规定了自己的Euc-kr编码,所以迫切需要一个世界的标准(能包含全世界的语言)于是unicode应运而生。

ascii用1个字节(8位二进制)代表一个字符

unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节

这时候乱码问题消失了,所有的文档我们都使用但是新问题出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效

本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间

  前提

    Python解释器的执行原理

1.13.3 总结字符编码的发展可分为三个阶段

阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII

ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符

ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符),后来为了将拉丁文也编码进了ASCII表,将最高位也占用了

#阶段二:为了满足中文和英文,中国人定制了GBK

GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符

为了满足其他国家,各个国家纷纷定制了自己的编码

日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里

 

#阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。如何解决这个问题呢???

1、能够兼容万国字符

#2、与全世界所有的字符编码都有映射关系,这样就可以转换成任意国家的字符编码

这就是unicode(定长), 统一用2Bytes代表一个字符, 虽然2**16-1=65535,但unicode却可以存放100w+个字符,因为unicode存放了与其他编码的映射关系,准确地说unicode并不是一种严格意义上的字符编码表

nicode的详情:

链接:

很明显对于通篇都是英文的文本来说,unicode的式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)

于是产生了UTF-8(可变长,全称Unicode Transformation
Format),对英文字符只用1Bytes表示,对中文字符用3Bytes,对其他生僻字用更多的Bytes去存

#总结:

内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。

      Python解释器执行Python文件三个阶段:

        1.先启动Python解释器

        2.Python解释器将name.py文件内容当做普通字符读入内存

        3.Python解释器解释执行读入内存的代码,识别Python语法

1.13.4 总字符编码应用之文件编辑器

#1、保证不乱吗的核心法则就是,字符按照什么标准而编码的,就要按照什么标准解码,此处的标准指的就是字符编码

#2、在内存中写的所有字符,一视同仁,都是unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是unicode转换成其他编码格式的过程了

                  unicode—–>encode——–>utf-8

                  utf-8——–>decode———->unicode

澳门新葡新京 19

 

 

图1-7  

 

      notepad++读取Python文件内容的三个阶段:

        1.先启动notepad++

        2.notepad++将name.py文件的内容当做普通字符读入内存

        3.notepad++将读入内存的字符打印到屏幕上

1.13.5 字符编码应用之python

执行python程序的三个阶段

python test.py   (执行test.py的第一步,一定是先将文件内容读入到内存中)

阶段一:启动python解释器

阶段二:python解释器此时就是一个文本编辑器,负责打开文件test.py,即从硬盘中读取test.py的内容到内存中

此时,python解释器会读取test.py的第一行内容,#coding:utf-8,来决定以什么编码格式来读入内存,这一行就是来设定python解释器这个软件的编码使用的编码格式这个编码,

可以用sys.getdefaultencoding()查看,如果不在python文件指定头信息#-*-coding:utf-8-*-,那就使用默认的

python2中默认使用ascii,python3中默认使用utf-8

阶段三:读取已经加载到内存的代码(unicode编码格式),然后执行,执行过程中可能会开辟新的内存空间,比如x=”egon”

内存的编码使用unicode,不代表内存中全都是unicode,

在程序执行之前,内存中确实都是unicode,比如从文件中读取了一行x=”egon”,其中的x,等号,引号,地位都一样,都是普通字符而已,都是以unicode的格式存放于内存中的,但是程序在执行过程中,会申请内存(与程序代码所存在的内存是俩个空间)用来存放python的数据类型的值,而python的字符串类型又涉及到了字符的概念

比如x=”egon”,会被python解释器识别为字符串,会申请内存空间来存放字符串类型的值,至于该字符串类型的值被识别成何种编码存放,这就与python解释器的有关了,而python2与python3的字符串类型又有所不同。

     总结:

        执行Python的程序前两个阶段与文本编辑器的原理一样

        只有第三个阶段才开始识别Python语法:

          n=1000

     Python解释器执行Python文件在第二到第三阶段涉及字符的概念,会用到字符编码

1.14 python2与python3字符串类型的区别

在python2中有两种字符串类型str和unicode

str类型

当python解释器执行到产生字符串的代码时(例如x=’上’),会申请新的内存地址,然后将’上’编码成文件开头指定的编码格式

要想看x在内存中的真实格式,可以将其放入列表中再打印,而不要直接打印,因为直接print()会自动转换编码,这一点我们稍后再说。

#coding:gbk

x='上'

y='下'

print([x,y]) #['\xc9\xcf', '\xcf\xc2']

 

#\x代表16进制,此处是c9cf总共4位16进制数,一个16进制四4个比特位,4个16进制数则是16个比特位,即2个Bytes,这就证明了按照gbk编码中文用2Bytes

print(type(x),type(y)) #(<type 'str'>, <type 'str'>)

 

内存中的数据通常用16进制表示,2位16进制数据代表一个字节,如\xc9,代表两位16进制,一个字节

gbk存中文需要2个bytes,而存英文则需要1个bytes,它是如何做到的???!!!

gbk会在每个bytes,即8位bit的第一个位作为标志位,标志位为1则表示是中文字符,如果标志位为0则表示为英文字符

x=‘你a好’

转成gbk格式二进制位

8bit+8bit+8bit+8bit+8bit=(1+7bit)+(1+7bit)+(0+7bit)+(1+7bit)+(1+7bit)

这样计算机按照从左往右的顺序读:

#连续读到前两个括号内的首位标志位均为1,则构成一个中午字符:你

#读到第三个括号的首位标志为0,则该8bit代表一个英文字符:a

#连续读到后两个括号内的首位标志位均为1,则构成一个中午字符:好

也就是说,每个Bytes留给我们用来存真正值的有效位数只有7位,而在unicode表中存放的只是这有效的7位,至于首位的标志位与具体的编码有关,即在unicode中表示gbk的方式为:

 

(7bit)+(7bit)+(7bit)+(7bit)+(7bit)

 澳门新葡新京 20

 

 

图1-8  

按照上图翻译的结果,我们可以去unicode关于汉字的对应关系中去查:链接:

# f=open(r'C:\Users\Administrator\PycharmProjects\python20期\day2\a.txt')



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

# data=f.read()

# print(data)

# print(f)

# f.close() #文件关闭,回收操作系统的资源

# print(f)

# f.read()



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

#     pass

 

 

 

1.什么是字符编码

  字符编码表就是一个存有字符与数字对应关系的表

    人类字符——->编码 encode ——–>数字

    人类字符<——-解码decode<———数字

  8bit = 1bytes

  ASCII : 8个二进制位(1bytes)对应一个英文字符

      A——>0001

  GBK
:16二进制位(2bytes)对应中文字符,8个二进制位(1bytes)对应一个英文字符   

    a     00  ,    b   01   ,    c    10   ,   d    11

      中——>111

  Shift-JIS   : 何——>001

  Unicode:统一用2bytes对应符号

      特点:1、Unicode 数字<——->字符

         2、Unicode 数字<——–>其他编码的数字

      解决两个问题:  1、兼容万国字符

               2、与各国的编码都有对应关系

1.15 文件处理

      ps:1、内存中固定使用Unicode,不能改   2、可以修改硬盘的编码

        Unicode———->编码encode———->GBK

        Unicode<———-解码decode<———–GBK

   utf-8 : 全程Unicode Transformation  Format

      1bytes代表一个英文字符

      3bytes代表一个中文字符

1.15.1 读操作:r只读模式,默认是rt文本读

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

# # data1=f.read()

# # print('=1===>',data1)

# # data2=f.read()

# # print('=2===>',data2)

#

# # print(f.readlines())

#

# # print(f.readline(),end='')

# # print(f.readline(),end='')

# # print(f.readline(),end='')

#

#

# f.close()

 

 

2.结论

  但凡出现乱码问题,一定是编码的时候用了一套标准,而解码的时候用了另一套标准

  解决乱码问题的核心: 编码的时候用什么编码,解码的时候就用什么解码

  Python3默认使用编码utf-8

  Python2默认使用ASCII

1.15.2 写操作:w只写模式,默认是wt文本写,如果文件不存在则创建,存在则清空+覆盖

f=open('a.txt','w',encoding='utf-8')

# f.write('11111\n')

# f.write('222222\n')

# f.write('1111\n2222\n3333\n')

# f.writelines(['哈哈哈哈\n','你好','alex'])

f.close()

 

澳门新葡新京 21

 

 

图1-9  

可以看到“”上“”对应的gbk(G0代表的是gbk)编码就为494F,即我们得出的结果,而上对应的unicode编码为4E0A,我们可以将gbk–>decode–>unicode

#coding:gbk

x='上'.decode('gbk')

y='下'.decode('gbk')

print([x,y]) #[u'\u4e0a', u'\u4e0b'] 

unicode类型

当python解释器执行到产生字符串的代码时(例如s=u’林’),会申请新的内存地址,然后将’林’以unicode的格式存放到新的内存空间中,所以s只能encode,不能decode

#coding:gbk

x=u'上' #等同于 x='上'.decode('gbk')

y=u'下' #等同于 y='下'.decode('gbk')

print([x,y]) #[u'\u4e0a', u'\u4e0b']

print(type(x),type(y)) #(<type 'unicode'>, <type 'unicode'>)

 

 

unicode这么好,不会乱码,那python2为何还那么别扭,搞一个str出来呢?python诞生之时,unicode并未像今天这样普及,很明显,好的东西你能看得见,龟叔早就看见了,龟叔在python3中将str直接存成unicode,我们定义一个str,无需加u前缀,就是一个unicode

在python3 中也有两种字符串类型str和bytes

str是unicode

#coding:gbk

x='上' #当程序执行时,无需加u,'上'也会被以unicode形式保存新的内存空间中,

print(type(x)) #<class 'str'>

#x可以直接encode成任意编码格式

print(x.encode('gbk')) #b'\xc9\xcf'

print(type(x.encode('gbk'))) #<class 'bytes'>

 

很重要的一点是:看到python3中x.encode(‘gbk’)
的结果\xc9\xcf正是python2中的str类型的值,而在python3是bytes类型,在python2中则是str类型

python2中的str类型就是python3的bytes类型,查看python2的str()源码可以发现

澳门新葡新京 22

 

 

图1-10  

 

  文件头的作用: 告知Python解释器读文件时应该用什么编码  

#conding:utf-8

澳门新葡新京 23澳门新葡新京 24

#coding:utf-8
x='上'

res1=x.encode('gbk') #unicode----编码----->gbk
res2=x.encode('utf-8') #unicode----编码----->gbk
print(res1,type(res1))
print(res2,type(res2))

# unicode<----编码decode----->gbk
print(res1.decode('gbk'))

字符编码测试

 

八、文件处理

  1.什么是文件:文件是操作系统为应用程序或用户提供的一个操作硬盘的虚拟的单位。

  2.为什么要用文件:应用程序中需要经常将内存中的数据永久保存,而应用程序无法直接操作硬盘

           只能通过操作系统提供的虚拟单位去间接地操作硬盘

  3.如何用文件

    Python的open操作:1.向操作系统发送打开文件的请求

             
 2.在应用程序拿到一个返回值,改值指向操作系统打开的文件

f=open(r'D:\a.txt',mode='r',encoding='utf-8')
# f=>应用程序中的一个值=>操作系统打开的文件a.txt=>硬盘中的一块空间
data=f.read()
print(data)
del f
f.close() # 向操作系统发送关闭文件的请求
print(f)
f.read()

总结:

  文件处理的步骤:1.打开文件  2.读/写文件  3 . 关闭文件

  ps:with open操作

with open(r'a.txt',mode='r',encoding='utf-8') as f,\
        open('b.txt',mode='r',encoding='utf-8') as f1:
    #文件处理的代码块
    pass

 

九、文件的打开模式

  文件的打开模式有三种

    r:只读模式(默认)

    w:只写模式

    a:只追加写

  控制操作文件内容的模式有两种(不能单独使用,必须与上述3种其中之一连用)

    t:(默认)text文本模式,该模式下操作文件内容的单位都是字符串,该模式只适用于文本文件
 ps:该模式必须指定encoding=’某种字符编码’

    b:bytes二进制模式,该模式下操作文件内容的单位都是bytes,该模式适用于所有类型的文件

1、r模式:只读(默认)

  文件不存在则报错;文件存在,并且文件指针调到文件开头

with open('a.txt',mode='rt',encoding='utf-8') as f:
    data1=f.read()
    print(type(data1))
    print('第一次:',data1) #第一次全部读取完毕
    data2=f.read()
    print('第二次',data2)  #第二次为空

with open('a.txt', mode='rt', encoding='utf-8') as f:
    line1=f.readline() #readline 一次只读取一行,指针跳到第二行开头
    print(line1,end='')
    print('====>')
    line2 = f.readline()#readline 一次只读取一行,指针跳到第二行开头
    print(line2, end='')


with open('a.txt', mode='rt', encoding='utf-8') as f:
    l=f.readlines()#一次性全部读取,包括换行符\n
    for i in l:
        print(i,end='')
    print(l,type(l))

2、w模式:只写模式

  文件不存在则创建空文档,并且文件指针跳到文件的开头

  文件存在,会将内容清空,并且文件指针跳到文件的开头

  ps:如果每次都是重新打开文件,那么文件的内容总会清空,指针跳到开头

    如果在打开文件不关闭的清空下,连续的写入,本次写入会基于上一次指针所在位置往后继续写

with open('c.txt',mode='wt',encoding='utf-8') as f:
#不关闭文件的清空下连续的写入
    f.write('hello\n')
    f.write('小蘑菇\n')
    l=['123\n','啦啦啦\n','卖女孩的小火柴\n']
    for line in l:
        f.write(line)
    f.writelines(l)

3、a模式:只追加写入

  文件不存在则创建一个空文档,并且文件指针跳到文件的末尾

  文件存在,也会将文件指针跳到文件的末尾

x=str(100-50)
with open('a.txt',mode='at',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    # f.read() 无法读取
    f.write('100')
    f.writelines([x,'\n'])

#读取文件的内容转换类型进行数学运算
with open('a.txt',mode='rt',encoding='utf-8') as f1:
    res=f1.readline()
    res2=f1.readline()
    print(res)
    print(res2)
    res3=int(res)+int(res2)
    print(res3)

4、b模式:bytes二进制模式,该模式下操作文件的内容的单位都是bytes,该模式适用于所有的文件类型

  ps:一定不能指定encoding参数

with open('1.mp4',mode='rb') as f:
    data=f.readline()
    print(data,type(data))

with open('d.txt',mode='rb') as f:
    data=f.read()
    # print(data,type(data))  #二进制模式
    res=data.decode('utf-8')  #读取需指定解码的编码类型
    print(res)

澳门新葡新京 25澳门新葡新京 26

# 遍历文件内容的方式
with  open('d.txt',mode='rt',encoding='utf-8') as f:
    for line in f: #line='bbb\n'
        print(line,end='')

遍历文件内容的方式

十、文件内指针的移动

  文件内指针的操作:f.seek

   第一个参数:控制移动的字节数

   第二个参数:控制移动的参照物,值可以为0(t、b模式都可以用)、1、2(1(文件的中间)2(文件的末尾)只能在b模式下使用)

with open('e.txt',mode='rt',encoding='utf-8') as f:
    f.seek(6,0) # 单位是字节
    print(f.read())  #移动6个字节后读取
    f.read()
    f.seek(0,0)  #又将指针移动到了开头
    print('第二次',f.read())

#read的n在t模式下代表的是字符个数
#read的n在b模式下代表的是字节个数

with open('e.txt',mode='rb') as f:
    data=f.read(3) #读取3个字节,即为一个中文字符
    print(data.decode('utf-8'))

 

十一、文件的修改

  一、文本编辑器修改文件的原理:

      1、先将文件内容全部读入内存

      2、在内存中修改完毕

      3、将修改的结果覆盖写回硬盘

      优点:在修改期间硬盘上同一时刻只有一份数据

      缺点:占用内存过高

with open('db.txt',mode='rt',encoding='utf-8') as f:
    data=f.read()
    new_data=data.replace('蘑菇','小蘑菇') #替换
    print(new_data)

with open('db.txt',mode='wt',encoding='utf-8') as f:
    f.write(new_data)

  二、一行行的读,一行行的改

    1.以读的模式打开源文件,以写的模式打开一个临时文件

    2.然后用for循环读取原文件一行行的内容,每读一行则修改一行,将修改的结果写入临时文件,直到把源文件都遍历完

    3.删除原文件,将临时文件重命名为原文件名

    优点:同一时刻在内存中只存在文件的一行内容

    缺点:在修改期间硬盘上同一份数据会有两份

import os

with open('db.txt',mode='rt',encoding='utf-8') as src_f,\
        open('.db.txt.swap',mode='wt',encoding='utf-8') as temp_f:
    for line in src_f:
        if '要修改的内容' in line:
            line=line.replace('同上内容','小蘑菇')
        temp_f.write(line)

os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')

澳门新葡新京 27澳门新葡新京 28

# 此操作用于删除特定内容所在的行
with open('db.txt','rt',encoding='utf-8')as f:
    lines=f.readlines()
with open('db.txt', 'wt', encoding='utf-8')as f1:
    for line in lines:
        if 'dsb' in line:  #如果内容在这行  将删除这行,别的行不动
            continue
        f1.write(line)

删除指定内容的行

 

十二、作业练习

  一、打印金字塔

澳门新葡新京 29澳门新葡新京 30

#              #max_level=5
#     *        #current_level=1,空格数=4,*号数=1
#    ***       #current_level=2,空格数=3,*号数=3
#   *****      #current_level=3,空格数=2,*号数=5
#  *******     #current_level=4,空格数=1,*号数=7
# *********    #current_level=5,空格数=0,*号数=9

#数学表达式
# 空格数=max_level-current_level
# *号数=2*current_level-1

max_level=int(input('数字: '))
for current_level in range(1,max_level+1):
    for i in range(max_level-current_level):
        print(' ',end='')
    for l in range(2*current_level-1):
        print('*',end='')
    print()

打印金字塔

  二、三级菜单

澳门新葡新京 31澳门新葡新京 32

#要求:
# 打印省、市、县三级菜单
# 可返回上一级
# 可随时退出程序
menu = {
    '北京':{
        '海淀':{
            '五道口':{
                'soho':{},
                '网易':{},
                'google':{}
            },
            '中关村':{
                '爱奇艺':{},
                '汽车之家':{},
                'youku':{},
            },
            '上地':{
                '百度':{},
            },
        },
        '昌平':{
            '沙河':{
                '老男孩':{},
                '北航':{},
            },
            '天通苑':{},
            '回龙观':{},
        },
        '朝阳':{},
        '东城':{},
    },
    '上海':{
        '闵行':{
            "人民广场":{
                '炸鸡店':{}
            }
        },
        '闸北':{
            '火车站':{
                '携程':{}
            }
        },
        '浦东':{},
    },
    '山东':{},

}

tag=True
while tag:#一级菜单
    menu1=menu
    for name in menu1:#打印第一层
        print(name)
    diyi=input('第一层>>>: ').strip()
    if  diyi=='q':#输入q则退出
        tag=False
    if diyi not in menu1: continue

    while tag:#二级菜单
        menu2=menu1[diyi]#menu[diyi]
        for name in menu2:#打印第二层
            print(name)
        dier=input('第二层>>>: ').strip()
        if dier == 'b': break#输入b则返回上一层
        if dier == 'q':#输入q则退出
            tag=False
        if dier not in menu2: continue

        while tag:#三级菜单
            menu3=menu2[dier]#menu[diyi][dier]
            for name in menu3:#打印第三层
                print(name)
            disan=input('第三层>>>: ').strip()
            if disan == 'b': break#输入b则返回上一层
            if disan == 'q':#输入q则退出
                tag=False
            if disan not in menu3: continue

            while tag:#四级菜单
                menu4=menu3[disan]#menu[diyi][dier][disan]
                for name in menu4:#打印第四层
                    print(name)
                disi=input('第四层>>>: ').strip()
                if disi == 'b': break#输入b则返回上一层
                if disi == 'q':#输入q则退出
                    tag = False
                if disi not in menu4: continue

三级菜单

  三、实现简单购物车

    用户名和密码存放于文件中,格式为:

         
 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序

        允许用户根据商品编号购买商品

           用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒

           可随时退出,退出时,打印已购买商品和余额

澳门新葡新京 33澳门新葡新京 34

product_list = {'1':['Iphone7',5800],
                '2':['Coffee',30],
                '3':['疙瘩汤',10],
                '4':['Python Book',99],
                '5':['Bike',199],
                '6':['ViVo X9',2499]}


d=product_list
#前期定义
tag=True
shopping=[]
with open('用户列表',mode='rt',encoding='utf-8')as user:#打开用户列表准备读取
    res=user.read().split('|')#读取按照'|'进行切分
    name=res[0]#读0号索引字符,赋值给name
    pwd=res[1]#读1号索引字符,赋值给pwd
n=1
while tag:#第一层循环开始
    if n==3:#如果错误3次则退出
        tag=False
    inp_name=input('输入您的用户名:').strip()
    if not inp_name or inp_name not in name:#判断输入字符与name的关系
        print('用户名不存在!')
        continue
    inp_pwd=input('输入您的密码:').strip()
    if  inp_pwd==pwd:#判断输入字符与pwd的关系
        print('登录成功!!!')
    else:
        print('您输入的密码有误!')
        n+=1
        continue
    while tag:#第二层循环开始
        wage=input('请输入您的工资:').strip()#第一次的金额
        if not wage.isdigit():#判断输入的是否是数字
            print('请输入数字')
            continue
        with open('余额', mode='wt', encoding='utf-8') as gongzi:#第一次新建文件‘余额’
            gongzi.write(wage)#写入之前输入的wage
        for k, v in d.items():  # k,v=('编号', '子列表')
            print(k,'',v)#循环打印字典的k,v
        while tag:#第三层循环开始
            print('q:退出')
            choice = input('购买商品:').strip()
            if choice=='q':#退出机制
                tag=False
                break
            if not choice or choice not in d:#判断输入字符与商品列表关系
                print('输入错误,请重新输入!')
                continue
            count = input('购买数量:').strip()
            if not count.isdigit():continue#判断count是否为数字

            wage1=int(d[choice][1])*int(count)#计算选择的商品乘数量后的价格

            with open('余额', mode='rt', encoding='utf-8') as f1:#选择商品后再次读取余额
                wage2=int(f1.read())
            if wage1 > wage2:#用户选择商品后,检测余额(作比较),够就(余额-商品金额)不够就提醒
                print('余额不足!')
                continue
            shopping.append(('商品',d[choice],'数量',count))
            #选择一次商品计算一次(工资减商品金额=余额   存入文件)
            with open('余额', mode='rt', encoding='utf-8') as balance:#第二次读取余额文件
                yue=balance.read()#读取余额赋值给yue
            with open('余额',mode='wt',encoding='utf-8') as balance1:#第二次写入计算结果至余额文件
                balance1.write(str(int(yue)-wage1))

with open('余额', mode='rt', encoding='utf-8') as ff:#第二次读取计算后的余额赋值给rse
    rse=ff.read()
    print('已购买',shopping,'余额',rse)

简单购物车

#用户列表
mogu|123

相关文章