二、数据类型、字符编码、文件处理

一、数据

 1、什么是数据?

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

  2、为何数据要分不同的类型?

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

  3、 数据类型

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

   字符串

   列表

   元组

   字典

   集合

 学习方法:

  #一:基本使用
  用途
  定义方式
  常用操作+内置的方法

  #二:该类型总结
  存一个值or存多个值
  只能存一个值
  可以存多个值,值都可以是什么类型
  有序or无序
  可变(id的基础上)or不可变
  !!!可变:值变,id不变。可变==不可hash
  !!!不可变:值变,id就变。不可变==可hash

 4、数字(int,float,complex)

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

  定义:

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

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

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

  长整形(了解)

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

      >>> num=2L
      >>> type(num)
      <type 'long'>

  复数(了解)  

      >>> x=1-2j
      >>> x.real
      1.0
      >>> x.imag
      -2.0

#一、int
#作用:年龄、级别、等级、身份证号
# x=10 #x=int(10)
# print(id(x),type(x),x)

#二、float
#浮点型float
#作用:薪资,身高,体重,体质参数等浮点数相关
#salary=3000.3 #本质salary=float(3000.3)
int与float

 

 5、字符串

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

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

    name='egon'

  常用操作:

    移除空白strip

    切分split

    长度len

    索引

    切片

  其他操作(包括常用)

#用途:描述性,记录名字、性别等
# name='egon' #name=str('egon')
# print(id(name),type(name),name)

#优先掌握的操作:
# 按索引取值(正向取+反向取) :只能取
print(name[0],type(name[0]))
print(name[-2])
name[0]='E'#字符串类型不能这样取
# 切片(顾头不顾尾,步长)
print(name[1:3])

msg='hello world'
print(msg[1:7])
print(msg[1:7:2])#隔一个取一个

msg='abcdefg'
# print(msg[1:6])
# print(msg[1:6:2])#bdf
# print(msg[:])#全取
# print(msg[::2])#aceg
# print(msg[5:0:-1])#fedcb
# print(msg[6::-1])#gfedcba


# # 长度len
# x=10
# print(len(x)) #数字没有长度
# msg='abc'
# print(len(msg))#len为3

# 成员运算in和not in
#msg='hello alex'
print('a' in msg)
print('alex' in msg)
print('ae' in msg)#必须连续匹配


# 移除空白strip(移除空白的方法)
# password='alex3724   '
# password=password.strip()
# print(password)
# print(password.strip())
# msg='***egon******' #取出‘*’
# print(msg.strip('*'))

# 切分split
# user_info='root:x:0:0::/root:/bin/bash'
# print(user_info[0:4])
# print(user_info.split(';',1))

# cmd='put  a.txt'
# print(cmd.split())#默认按照空格切 ['put', 'a.txt']
# filepath='/a/b/c/a.txt'
# print(filepath.split('/',1))#['', 'a/b/c/a.txt']
# print(filepath.split('',1))#['', 'a/b/c/a.txt']

# msg='alex say is have'
# print(msg.split(maxsplit=1)[0])

# msg='***alex****'
# print(msg.strip('*'))
# print(msg.lstrip('*'))
# print(msg.rstrip('*'))

#startswith,endswith
# name='alex_SB'
# print(name.endswith('SB')) #以什么结尾
# print(name.startswith('alex'))#以什么开始


#replace
# name='alex say :i have one tesla,my name is alex'
# print(name.replace('alex','SB',1))(1:替换的次数)


#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)\

# print('my name is %s my age is %s' %('egon',18))
# print('my name is {} my age is {}'.format('egon',18))
# print('my name is {x} my age is {y}'.format(x='egon',y=18))#不在依赖位置去传值

#find,rfind,index,rindex,count 查找是否存在子字符串
# msg='hello world'
# print(msg.find('d'))#从左到右找,如果有,则返回第一个字符的索引
# print(msg.find('ell'))
# print(msg.find('adadada'))#从左到右找,如果没有,返回-1

# print(msg.index('d'))#从左到右找,如果有,则返回第一个字符的索引
# print(msg.index('x'))#从左到右找,如果有,则返回第一个字符的索引

# print(msg.count('l',0,4))#0开始,4结束,重复2次
# print(msg.count('l',0,4))#0开始,3结束

#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'])) #可迭代对象必须都是字符串


#center,ljust,rjust,zerofill
#============egon=============
# print('egon'.center(30,'='))#宽度为30,填充物为‘=’
# print('egon'.rjust(30,'='))#宽度为30,填充物为‘=’右对齐
# print('egon'.ljust(30,'='))#宽度为30,填充物为‘=’左对齐
# print('egon'.zfill(30))#宽度为30,填充物为‘=’

#is 系列

#判断数字
age=10
inp=input('>>:'.strip())
if inp.isdigit():##判断字符是否为数字
    if inp > age:
    print('ok')
else:
    print('输入数字')

# num1=b'4' #bytes
# num2=u'4' #unicode,python3中无需加u就是unicode
# num3='四' #中文数字
# num4='Ⅳ' #罗马数字

# print(msg.isdigit())  #只能判断bytes、unicode类型
# print(msg.isdecimal())#只能判断unicode
# print(msg.isnumeric())#unicode、汉字、罗马

其它:
#strip
name='*egon**'
print(name.strip('*'))
print(name.lstrip('*'))
print(name.rstrip('*'))

#startswith,endswith
name='alex_SB'
print(name.endswith('SB'))
print(name.startswith('alex'))

#replace
name='alex say :i have one tesla,my name is alex'
print(name.replace('alex','SB',1))

#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)

#find,rfind,index,rindex,count
name='egon say hello'
print(name.find('o',1,3)) #顾头不顾尾,找不到则返回-1不会报错,找到了则显示索引
# print(name.index('e',2,4)) #同上,但是找不到会报错
print(name.count('e',1,3)) #顾头不顾尾,如果不指定范围则查找所有


#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'])) #可迭代对象必须都是字符串

#center,ljust,rjust,zfill
name='egon'
print(name.center(30,'-'))
print(name.ljust(30,'*'))
print(name.rjust(30,'*'))
print(name.zfill(50)) #用0填充


#expandtabs
name='egon\thello'
print(name)
print(name.expandtabs(1))

#lower,upper
name='egon'
print(name.lower())
print(name.upper())


#captalize,swapcase,title
print(name.capitalize()) #首字母大写
print(name.swapcase()) #大小写翻转
msg='egon say hi'
print(msg.title()) #每个单词的首字母大写

#is数字系列
#在python3中
num1=b'4' #bytes
num2=u'4' #unicode,python3中无需加u就是unicode
num3='' #中文数字
num4='' #罗马数字

#isdigt:bytes,unicode
print(num1.isdigit()) #True
print(num2.isdigit()) #True
print(num3.isdigit()) #False
print(num4.isdigit()) #False


#isdecimal:uncicode
#bytes类型无isdecimal方法
print(num2.isdecimal()) #True
print(num3.isdecimal()) #False
print(num4.isdecimal()) #False

#isnumberic:unicode,中文数字,罗马数字
#bytes类型无isnumberic方法
print(num2.isnumeric()) #True
print(num3.isnumeric()) #True
print(num4.isnumeric()) #True


#三者不能判断浮点数
num5='4.3'
print(num5.isdigit()) 
print(num5.isdecimal())
print(num5.isnumeric())
'''
总结:
    最常用的是isdigit,可以判断bytes和unicode类型,这也是最常见的数字应用场景
    如果要判断中文数字或罗马数字,则需要用到isnumeric
'''

#is其他
print('===>')
name='egon123'
print(name.isalnum()) #字符串由字母或数字组成
print(name.isalpha()) #字符串只由字母组成

print(name.isidentifier())
print(name.islower())
print(name.isupper())
print(name.isspace())
print(name.istitle())
其它用法

 

 

  6、列表

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

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

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

    或

    l=list('abc')

  常用操作:

    索引

    切片

    追加

    删除

    长度

    循环

    包含in

# 作用:多个装备,多个爱好,多门课程,多个女朋友等
# #定义:[]内可以有多个任意类型的值,逗号分隔
# my_girl_friends=['alex','wupeiqi','yuanhao',4,5] #本质my_girl_friends=list([...])

# #优先掌握的操作:
# 按索引存取值(正向存取+反向存取):即可存也可以取
# print(my_girl_friends[2])
# print(my_girl_friends[-1])
#print(id(my_girl_friends))
# my_girl_friends[0]='sb'
#print(id(my_girl_friends))
# print(my_girl_friends)
#id 是一致的,可变

# 切片(顾头不顾尾,步长)
# print(my_girl_friends[1:5:2])

# 长度
#print(len(my_girl_friends))

# 成员运算in和not in
# print('alex' in my_girl_friends)
# print(5 in my_girl_friends)

# 追加
# my_girl_friends.append('6号')
# print(my_girl_friends)

# 删除
# del my_girl_friends[2] #通用删除列表内部
# print(my_girl_friends.remove('6号'))  #指定删除的元素,remove是单纯的删除,不会删除返回的值,并且是按照值去删除
# print(my_girl_friends)
# my_girl_friends.pop()#按照索引去删除,默认从末尾开始删
# res=my_girl_friends.pop(1)
# print(my_girl_friends)
# print(res)
# 循环

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

#常用操作:
# my_girl_friends.insert(0,'ce')#插入一个值
# my_girl_friends.extend([1,2,3])#以列表的形式,添加到原始列表的末尾
# print(my_girl_friends.count('alex'))#统计个数

# print(my_girl_friends)

# my_girl_friends.clear()
# my_girl_friends.copy()
# my_girl_friends.extend()
# my_girl_friends.insert()
# my_girl_friends.sort()#排序
# my_girl_friends.reverse()#反转

# 练习:
# 队列:先进先出
# append,pop
# l1=['four']
# l1.append('first')
# l1.append('second')
# l1.append('third')
# print(l1)
# print(l1.pop(1))
# print(l1.pop(1))
# print(l1.pop(1))
# print(l1)

# 堆栈:先进后出

# l1=['four']
# l1.insert(0,'first')
# l1.insert(0,'second')
# l1.insert(0,'third')
# print(l1)
# print(l1.pop(0))
# print(l1.pop(0))
# print(l1.pop(0))
 # print(l1)



#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]
其它用法

 

 

   7、元组

  作用:存多个值,对比列表来说,元组不可变,主要是用来读

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

    可以当做字典的key

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

  常用操作:

    索引

    切片

    循环

    长度

    包含in

# 作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读
# ages=(10,12,18,33) #ages=tuple((10,12,18,33))
# print(id(ages),type(ages),ages)
#列表可以改,元组不可以改。元组的目的是为了查询,能存能取用列表

#定义:与列表类型比,只不过[]换成()
# age=(11,22,33,44,55)#本质age=tuple((11,22,33,44,55))

#优先掌握的操作:
# 按索引取值(正向取+反向取):只能取
# 切片(顾头不顾尾,步长)
# print(age[0:2])
# 长度
# 成员运算in和not in
# print(10 in age)
# age=(11,18,22,33,44,55)
# print(age.index(18))#值的次数
# age.count()

# l=['a','b','c','d','e']
# l='abcde'
# l=('a','b','c','d','e')  仅限这三种依赖索引
# index=0
# while index < len(l):
#     print(l[index])
#     index+=1

# l=['a','b','c','d','e']
# for item in l
# print(item)
# # 循环


# msg_dic={
# 'apple':10,
# 'tesla':100000,
# 'mac':3000,
# 'lenovo':30000,
# 'chicken':10,
# }
#对于字典来说,in是以key为依据的
# for key in msg_dic:
#     print(key,msg_dic[key])

# for i in range(1,10,2):
#     print(i)


# msg_dic={
# 'apple':10,
# 'tesla':100000,
# 'mac':3000,
# 'lenovo':30000,
# 'chicken':10,
# }
#
# market=[]
# while True:
#     for key in msg_dic:
#         print(key,msg_dic[key])
#         choice = input('商品名:').strip()
#         if choice not in msg_dic:continue
#         count = input('个数:').strip()
#         if  count.isdigit():
#             market.append((choice,msg_dic[choice],int(count)))
#
#         print(market)

for i in range(5):
    if i == 3:break
    else:
        print('ok')
其它用法

 

 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)

  常用操作:

    存/取

    删除

    键s,值s,键值对

    长度

    循环

    包含in

#作用:存多个值,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)

#优先掌握的操作:
# 按key存取值:可存可取
# info={'name':'egon','age':18,'sex':'male'}
# print(info['sex'])
# info['hobbis']=['read','music']
# print(info)
# 长度len
# print(len(info))
# 成员运算in和not in
#
#
# 删除
# print(info.pop('name'))#egon
# print(info.pop('name123','None'))

# 键keys(),值values(),键值对items()
# print(info.keys()) #取出所有的key,dict_keys(['name', 'age', 'sex']) 不是列表类型
# print(info.values())#只取值
# print(info.items())#dict_items([('name', 'egon'), ('age', 18), ('sex', 'male')]),以元组的方式存储

# for item in info.items():
#     print(item[0],item)
# 循环

#其他用法
info={'name':'egon','age':18,'sex':'male'}
# info.fromkeys()
# print(info.get('name123',123))
# print(info.popitem())
# for k,v in info.items():
#     print(k,v)

# info_new={'a':1,'age':19}#更新
# info.update(info_new)
# print(info)

# dic={}.fromkeys(['name','age','hobbiex'],None)#快速生成字典
# print(dic)

# for i in info.items():
#     print(i[0])
# 两种赋值方式:
# 一、链式赋值
# x=10
# y=x
# x=y=z=10
# print(id(x),id(y),id(z))
#交换两个变量的值
# m=10
# n=20
# temp=n
# n=m #n=10
# m=temp
# print(m,n)

# m,n=n,m
# print(m,n)

# 二、从一个数据类型中解压出我们想要的值

t=(10.3,11.2,12.1,14.3,3.1) #元组
# s1=t[0]
# s2=t[1]
# s3=t[2]
# print(s1)
# x,_,_,_,b=t#'_'代表一个占位符
# x,*_,b=t
# print(x,b)
# print(_)#14.3

# name='hello'
# x,*_=name #字符串
# print(x)

# x,y={'a':1,'b':2,'c':3}#字典
# print(x,y,z)#只取key

# l=['zzz','xxx','ccc']#列表
# x,*_,b=l
# print(x,b)

# info.setdefault()#设置默认值
# info.setdefault('age',19)#如果字典中存在这个key了,则不修改,(有则不改,返回旧的值,没有则返回新增的值)
# print(info)

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

# if 'hobbies' not in info: ###替代了setdefault
#     info['hobbies']=[]
#     info['hobbies'].append('music')
# else:
#     info['hobbies'].append('read')
# if 'hobbies' not in info:
#     info['hobbies']=[]
#     info['hobbies'].append('music')
# else:
#     info['hobbies'].append('read')
# print(info)

# print(id(info.setdefault('hobbies',[])))
# print(id(info['hobbies']))

# info.setdefault('hobbies',[]).append('music')
# info.setdefault('hobbies',[]).append('read')#{'name': 'egon', 'age': 18, 'sex': 'male', 'hobbies': ['music', 'read']}
# print(info)

# info.popitem()
# info.update()
其它方法

 

 

  9、集合

  作用:去重,关系运算,

  定义:

  知识点回顾
    可变类型是不可hash类型
    不可变类型是可hash类型  

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

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

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

  2:没有重复的元素
  3:无序

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

  

   常用方法:

    in 和 not in

    |合集

    &交集

    -差集

    ^对称差集

    ==

    >,>= ,<,<= 父集,子集

  

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

# 定义:
# 知识点回顾
# 可变类型是不可hash类型
# 不可变类型是可hash类型
# s={1,2,'a','a'}#s=set({1,2,'a'})
# print((type(s),s))


# 定义集合:
# 集合:可以包含多个元素,用逗号分割,
# 集合的元素遵循三个原则:
# 1:每个元素必须是不可变类型(可hash,可作为字典的key)
# 2: 没有重复的元素
# 3:无序

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

# 优先掌握的操作:
# s={1,2,'a','b','c','d'}
# 长度len
# print(len(s))
# 成员运算in和not in
# for item in s:
#     print(item)
#
# | 合集(并集)
# s1={1,2,3}
# s2={3,4,5}
# print(s1 | s2)
# & 交集
# s1={1,2,3}
# s2={3,4,5}
# print(s1 & s2)
# -差集
# s1={1,2,3}
# s2={3,4,5}
# print(s1 - s2)
# ^ 对称差集 取共有部分之外的部分,没有同时存在在这个集合的值
# s1={1,2,3}
# s2={3,4,5}
# 3

# ==
# > , >= , <, <= 父集,子集


# 一.关系运算
#   有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
#   pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
#   linuxs={'wupeiqi','oldboy','gangdan'}
#   1. 求出即报名python又报名linux课程的学员名字集合
#   2. 求出所有报名的学生名字集合
#   3. 求出只报名python课程的学员名字
#   4. 求出没有同时这两门课程的学员名字集合

# pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
# linuxs={'wupeiqi','oldboy','gangdan'}
#
# print(pythons&linuxs)
# print(pythons|linuxs)
# print(pythons-linuxs)
# print(pythons^linuxs)

#其他方法
s1={1,2,3,4}
s2={3,4,5}
# |
# print(s1.union(s2))

# &
# print(s1.intersection(s2))
# print(s1.intersection_update(s2)#s1=s1.intersection(s2)
# -
# print(s1.difference(s2))

# ^
# print(s1.symmetric_difference(s2))

# ==

# >,>= <,<=
# print(s1.issubset(s2))
# print(s2.issuperset(s=2))


# s1.pop()#随机删,并返回删除的结果
# s1.discard()#单纯的删除,不会返回删除的结果,如果删除的元素不存在,不会报错
# s1.remove()#指定元素删除,单纯的删除,不会返回删除的结果,并且删除的元素不存在,会报错
#
#
# s1.add()#添加值,无序
# s1.isdisjoint()#如果s1和s2没有交集,返回true

#去重
# l=['a','b','c','a']
# print(list(set(l)))

# l=['a','b','c','a']
# l_new=list()
# s=set()
# for item in l:
#     if item not in s:
#         s.add(item)
#     l_new.append(item)
#     print(item)

# 了解
# frozenset;不可变集合

# 容器类型:列表、字典、集合
其它方法

 

 10、数据类型总结

  按存值个数区分

标量/原子类型数字,字符串
容器类型列表,元组,字典

   

 

按可变不可变区分

可变列表,字典
不可变数字,字符串,元组

 

 

按访问顺序区分

直接访问数字
顺序访问(序列类型)字符串,列表,元组
key值访问(映射类型)字典

 

 

 

  11、运算符

  成员运算(in ,not in)

  身份运算(is ,is not)

  详细:http://www.cnblogs.com/linhaifeng/articles/5935801.html#_label34

  12、字符编码

  http://www.cnblogs.com/linhaifeng/articles/5950339.html 

  13、文件处理

  http://www.cnblogs.com/linhaifeng/articles/5984922.html

 练习:

  1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数

apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3

  2. 修改文件内容,把文件中的alex都替换成SB

 文件内容全部来源于http://www.cnblogs.com/linhaifeng/articles/7133357.html 海峰老师

转载于:https://www.cnblogs.com/chyc/p/7497369.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值