第二课 基础数据类型

一、基础数据类型:

1、整型 int

  1.1   i=11    type(i)查看数据类型

  1.2  重要方法:bit_length()   例子:i=11转成二进制0000 1011   那么i.bit_length() 值是4位,因此是查二进制所占的位数

  1.3 查看 int 源码就能看到int所包含的全部方法

  1.4 类型之前的转换:

    int ---> str   添加单引号、双引号、三引号即可,比如:‘123’

    int ---> bool  0表示假,非0表示真

    str --->int     当字符串全部为数字时才能转换int类型,比如:a='132'   b=int(a)   print(type(a),type(b))

    str --->bool   print(bool(''))#空字符串,为假 ;print(bool(' ')) 非空为真

2、字符串str

  2.1  字符串的索引与切片

    索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推。

# str 取数
# s='python自动化21期'
# s1=s[0]
# print(s1)
# s2=s[:6]
# print(s2)
# s3=s[6:7]
# print(s3)
# s4=s[:6:-1]
# print(s4)
# s5=s[:-1:2]#隔以为取一个数
# print(s5)
# print(s[:0:-2]) #反向设置步长

   2.2 字符串的方法:

    1、capitalize()  首字母变成大写,其他字母变成小写

    2、upper()      全部转换成大写

    3、lower()  全部转换成小写

    例子:验证码不区分大小写:

code='AxBy'.upper()
your_code=input('请输入验证码:').upper()
if your_code == code:
    print('验证成功')

    4、swapcase()  大小写反转

    5、title()#*非字母的元素隔开的每个单词首字母大写

    6、center(self, width, fillchar=None)居中,长度自己设定,默认填充物None  例子:s.center(30,"*")

    7、startswith(self, prefix, start=None, end=None)是不是已什么开头,字符+开始位置+结束位置,也可不写

    8、strip(self, chars=None)去除首尾的空格,制表符\t,换行符。不仅仅是去除空格....

      8.1  lstrip(self, chars=None)   左侧截取

      8.2  rsplit(self, sep=None, maxsplit=-1)   右侧截取

例1:
# *** strip 去除首尾的空格,制表符\t,换行符。不仅仅是去除空格....
#lstrip() rstrip()
# print(s)
# s='       oldbay        ' 
# s8 = s.strip() #去掉前后空格
# print(s8)
# s='\toldbay\n' 
# s81 = s.strip('t')  #去掉换行
# print(s81)
# s='tyoldbayrrrte'
# s81 = s.strip('tey')# 去掉前后包含tey的元素
# print(s81)
例子2:(以后用户登录都要加。strip()
name = input('用户名>>:').strip()
if name=='oldbay':
    print('验证成功')

例子3:
while True:
cmd=input('>>: ').strip()
if len(cmd) == 0:continue #什么也不输入是跳过继续
cmd_l=cmd.split()
print('命令是:%s 命令的参数是:%s' %(cmd_l[0],cmd_l[1]))#第一个空格截图两个字符串输出

     9、split(self, sep=None, maxsplit=-1)对字符串、列表进行分割转换及合并转换,可以将字符串转成列表,可以将列表转成字符

例子:
# #*** split  (str ---> list)字符串转成列表
# s = 'oldboy wusir alex'
# l = s.split()
# print(l)
# s1 = 'oldboy,wusir,alex'
# l = s1.split(',')
# print(l)
# l2 = s.split('o')  #['', 'ldb', 'y wusir alex'] #当o是第一个字母时,以o截取,前面会生成一个空字符
# print(l2)
# l2 = s.split('o',1)  # ['', 'ldboywusiroalex'] #以第一个o截取
# print(l2)

# s = 'oldBoy'
# # join 将list --->str 将列表转成字符串(要求列表都是字符串)
 # s9 = '+'.join(s) #如果是字符串,将+号加入到oldbay每一个元素中间 # # s9 = '_'.join(s) # print(s9) # l1 = ['oldboy','wusir','alex'] # s91 = '_'.join(l1)#如果是列表,将—加到每一个字符串中间(将列表转成一个字符串) # print(s91,type(s91))

    10、replace(self, old, new, count=None)替换内容 :例子:s10=s.replace('铁锤','钢蛋')

    11、find(self, sub, start=None, end=None) 通过元素找索引 找不到返回-1;index(self, sub, start=None, end=None)通过元素找索引 找不到报错;建议用find

    12、format(self, *args, **kwargs)格式化输出 

例子:
res='我叫{}今年{}岁,爱好{}'.format('egon',18,'male') #要求字符串中的{}与format中的字符串相同 print(res) res='我叫{0}今年{1}岁,爱好{2},我依然叫{0}'.format('egon',18,'male')#字符串中的{}中的元素位置是format中存在的就可以 print(res) res='{name} {age} {sex}'.format(sex='male', name='egon', age=18)#format以键值对存在,字符串中{}内写上key就行 print(res)

     13、公共方法:len()查询字符串的长度,例子:len(s);count(self, sub, start=None, end=None)数字符串中元素出现的次数,可以设置开始位置和结束位置

     14、isdigit(self)判断字符串是否全部由数字组成;isalpha(self)判断字符串是否全部由字母组成;isalnum(self)判断字符串是否由字母+数字组成;

例子:
# i = '123a'
# if i.isdigit():
#     i = int(i)
# else:
#     print("输入有误...")

    15、encode(self, encoding='utf-8', errors='strict' 

 3、列表:list

  3.1、增、删、改、查

# list
# 1索引、切片
# 增、删、改、查
# 增加:append insert extend
# 删除:pop()   remove() clear()
# 删除列表:del list(内存中删除列表)
#         del l[1] 按索引删除
#         切片删除 del l[:3]
li = ['aa','b','alex','wusir']
#增加
#  li.append('taibai')
# li.insert(1,'ttt')
# li.extend('abc')#字符串增加,如果只有一个元素,只增加一个;循环迭代增加
# li.extend(['aaa','qqqq','rrrr'])#列表循环增加
#修改
# li[0]='AAA'#按索引去改
# li[:2]='qwe'#按切片去修改 修改是删除切片范围内的数据,将新元素全部替换进去
# li[:2]=['ewq','fff',123]
#删除
# li.pop()
# li.pop(2)
# li.remove('aa')
# li.clear()
# del li[0]
# del li
# print(li)
#查   索引、切片、循环:for(循环数据类型)
# for i in li:
#     print(i,type(i))  #全部转成字符串输出

  3.2、其他方法:count(s)数数、  len(s)求s长度、index(self, value, start=None, stop=None)查元素的位置 、sort()对数字排序、 reverse()对列表反转

#其他方法:count(数数)  len(长度)  index()  sort() reverse()
# li = [2,3,5,1,6]
# li.sort(reverse=True)#对列表中的数字进行排序,默认false正序
# li.sort()
# print(li)
# li = [3,2,4,2,1,5,2,5]
# print(li.count(2))
# print(len(li))
# for i in range(len(li)):
#     print(i)
#     i +=1
# li = ['aa','b','alex','wusir']
# print(li.index('alex'))
# li.reverse()
# print(li)
#练习
# l1 = [1, 2, 'alex', 'wusir',['oldboy', 'ritian', 99], 'taibai']
# # alex 大写
# # l1[2]=l1[2].upper()
# # print(l1)
# #追加女神
# # l1[4].append('女神')
# # print(l1)
# # print(l1[-2][1] )
# # l1[-2][1] = l1[-2][1].capitalize()
# # print(l1)
# # print(l1[:3])
# l1[-2][2] = str(l1[-2][2] +1)
# print(l1)

copy:方法
import copy
list
li = [1,2,3,[33,44]]
l1=li
l2=li.copy()# 浅复制,儿子的数据不变,孙子的数据之前统一引用
l22=copy.copy(li)#同上
l3=copy.deepcopy(li)#深复制,儿子、孙子都不变
li[0]=55
li[3][0]=66
print(l1)
print(li)
print(l2)
print(l22)
print(l3)
 
enumerate 循环中有两个元素   和字典相似,for循环字典是也是k、v两个

li = ["手机", "电脑", '鼠标垫', '游艇']
# for i,j in enumerate(li):
# print(i+1,j)
# 1 手机
# 2 电脑
# 3 鼠标垫
# 4 游艇
# for i,j in enumerate(li,1):
# print(i,j)
# 1 手机
# 2 电脑
# 3 鼠标垫
# 4 游艇
for i in enumerate(li,1):
print(i)
# (1, '手机')
# (2, '电脑')
# (3, '鼠标垫')

# (4, '游艇')

4、字典

#dict
#增  和 setdefault()
#删 通过健删除 pop()、clear()、del()(删除整个字典或键值对)、popitem()
#字段的pop 可以默认值 pop('name','没有此key ')

#改:直接改 、update()字典1覆盖添加到字典2中
#查 直接查、dic.get('name','没有此key')

#keys() values() items()

#分别赋值:
# a,b=1,2
# a,b,c=['alex','wusir','taibai']
# a,b=b,a #a,b值互换

#len

#fromkeys 构建字典

嵌套 :字典中创建字典

  4.1、增、删、改、查

#
# dic = {'name': 'taibai', 'age': 21, 'hobby': 'girl', }
# # dic['high']=18
# # print(dic)
# # dic['name']='alex'
# # print(dic)
# # dic.setdefault('high',19)
# # print(dic)
# # dic.setdefault('name','aaa')
# # print(dic)
# #删
# # print(dic.pop('name'))
# # print(dic.pop('name1','不存在key'))
# # print(dic)
# # dic.clear()
# # print(dic)
# # print(dic.popitem()) #随机删除 3.6后字典为有序的
# # print(dic)
# # del dic
# # print(dic)
# # del dic['name']
# # print(dic)
# #改
# # dic['name']='wusir'
# # print(dic)
# # dic2 ={'name':'alex','weight':75}
# # dic2.update(dic)#将dic的键值对覆盖添加到dic2中,dic不变
# # print(dic2)
# #查
# print(dic['name'])
# print(dic.get('name'))
# print(dic.get('name1','不存在key'))
#for i in dic: 和for i in dic.keys() 一样都是按键来循环
#另外一种:for k,v in dic:
        print(k,v) 分别打印k,v的值

  4.2、其他方法:len()、keys()、values()   、fromkeys(*args, **kwargs)构建字典 fromkeys(seq[, value]))、setdefault(self, k, d=None)添加键值对、update(self, E=None, **F)

fromkeys 批量增加字典的value值,key可以是字符串、列表、元组等
#
fromkeys # seq = ('name', 'age', 'sex') # dict = dict.fromkeys(seq) # print(dict)#{'name': None, 'age': None, 'sex': None} # dict = dict.fromkeys(seq, 10) # print(dict)#{'name': 10, 'age': 10, 'sex': 10} # s='abc' # dict = dict.fromkeys(s) # print(dict)#{'a': None, 'b': None, 'c': None} # dict = dict.fromkeys(s, 10) # print(dict)#{'a': 10, 'b': 10, 'c': 10} # s=['a','b','c'] # dict=dict.fromkeys(s) # print(dict){'a': None, 'b': None, 'c': None} # dict=dict.fromkeys(s,'aaa') # print(dict)#{'a': 'aaa', 'b': 'aaa', 'c': 'aaa'}

  4.3、例题:

dic = {
    'name_list':['b哥', '张帝', '人帅', 'kitty'],
    '老男孩':{
        'name':'老男孩',
        'age': 46,
        'sex': 'ladyboy',
    },
}
# 1,['b哥', '张帝', '人帅', 'kitty']追加一个元素,'骑兵'
dic['name_list'].append('骑兵')
print(dic)
# 2,将kitty全部变成大写。
dic['name_list'][-1] =  dic['name_list'][-1].upper()
print(dic)
# 3,将老男孩 改成oldboy。
dic['老男孩']['name'] = 'oldbay'
print(dic)
# 4,将ladyboy首字母大写。
dic['老男孩']['sex'] = dic['老男孩']['sex'].capitalize()
print(dic)

 5、元组

   元组被称为只读列表,即数据可以被查询,但不能被修改,所以,字符串的切片操作同样适用于元组。例:(1,2,3)("a","b","c")

#增加   不可修改(儿子级不能改,孙子级可以修改,比如中嵌套列表)
#for循环
#索引、切片
#其他count() index() 通过元素找索引 len()
#创建空元组:
tup1 = ();
#元组与元组连接:(1, 2, 3) + (4, 5, 6)
#元组复制:('Hi!',) * 4
#创建一个元素的元组:tu=(1,) tu2=('s',)

 6、集合

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

    作用:去重,关系运算

    定义:可以包含多个元素,用逗号分割,集合的元素遵循三个原则:

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

      2.没有重复的元素

      4.无序

    1、关系测试。交集、并集、子集、差集。。。 in   not in 

    2、去重(列表的去重)
集合的增、删除、去重
#
set1 = {1,'alex',False,(1,2,3)} # l1 = {1,1,2,2,3,3,4,5,6,6} # l2 = list(set(l1)) #去重 # print(l2) set1 = {'alex','wusir','ritian','egon','barry'} # #增 # set1.add('666') # print(set1) #update # set1.update('abc')#将abc元素分别加入 # print(set1) # # set1.remove('alex') # 删除一个元素 # print(set1) # set1.pop() # 随机删除一个元素 # print(set1) # set1.clear() # 清空集合 # print(set1) # del set1 # 删除集合 # print(set1)
关系测试。交集、并集、子集、差集:
#
set1 = {1,2,3,4,5} # set2 = {4,5,6,7,8} #交集 & intersectio # print(set1 & set2) # print(set1.intersection(set2)) #并集 | union # print(set1 | set2) # print(set1.union(set2)) #差集 - difference # print(set1 - set2) # print(set1.difference(set2)) #反交集 ^ symmetric_difference # print(set1 ^ set2) # print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8} # set1 = {1,2,3} # set2 = {1,2,3,4,5,6} # print(set1 < set2) # print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 # print(set2 > set1) # print(set2.issuperset(set1)) # s = frozenset('barry') # s1 = frozenset({4,5,6,7,8}) # print(s,type(s)) # print(s1,type(s1))

7、数据类型的补充:

  7.1再循环一个列表时,不要对列表进行删除的动作(改变列表元素的个数动作),会出错

再循环一个列表时,不要对列表进行删除的动作(改变列表元素的个数动作),会出错
l1 = ['alex', 'wusir', 'taibai', 'barry', '老男孩'] #1 # del l1[1::2] # print(l1) # # for i in range(len(l1)): # print(l1) # ['alex', 'wusir', 'taibai', 'barry', '老男孩'] # # ['alex', 'wusir', 'taibai', 'barry', '老男孩'] # # ['alex', 'taibai', 'barry', '老男孩'] # # ['alex', 'taibai', 'barry', '老男孩'] # print(i) # 0 1 2 3 # if i % 2 == 1: # del l1[i] # print(l1) # ['alex', 'wusir', 'taibai', 'barry', '老男孩'] # # ['alex', 'taibai', 'barry', '老男孩'] # # ['alex', 'taibai', 'barry'] # print(i) # 0 1

  7.2range 可定制的数字列表

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

# for i in range(10,1,-1):
#     print(i)
# print(range(10))
# for i in range(len(l1)-1,-1,-1):
#     if i % 2 == 1:
#         del l1[i]
# print(l1)

  7.3 dict 再循环字典时,不要改变字典的大小。

# dic = {'k1':'v1','k2':'v2','k3':'v3','r':666}
# l1 = []
# for i in dic:
#     if 'k' in i:
#         l1.append(i)
# # print(l1)
#
# for i in l1:
#     del dic[i]
# print(dic)

  7.4tu 如果元组里面只有一个元素并且没有逗号隔开,那么他的数据类型与该元素一致。

tu1 = (1)
print(tu1,type(tu1))
tu2 = ('alex')
print(tu2,type(tu2))

tu3 = (['alex',1,2])
print(tu3,type(tu3))

8、小数据池:

#id == is
# a = 'alex'
# b = 'alex'
# print(a == b)  # 数值
# print(a is b)  # 内存地址
# print(id(a))

#python中 有小数据池的概念。
# int -5 ~256 的相同的数全都指向一个内存地址,节省空间。
# str:s = 'a' * 20 以内都是同一个内存地址
    #只要字符串含有非字母元素,那就不是一个内存地址
#深浅copy
#赋值运算,它们共用一个列表
# a = [1,2,3]
# b = a
# a.append(666)
# print(a,b)#a,b同时增加666,公用一个内存地址

#浅copy     对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始
# l1 = [1,2,3]
# l2 = l1.copy()
# l1.append(666)
# print(l1,l2) l1增加了666,l2不增加666
# print(id(l1),id(l2)) 内存地址不一样

# l1 = [1,2,3,[22,33]]
# l2 = l1.copy()
# l1[-1].append(666)
# print(l1,l2)
# print(id(l1[-1]),id(l2[-1])) 一样都会增加666,

#对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,
# 指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性

#深copy 对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
# import copy
# l1 = [1,2,3,[22,33]]
# l2 = copy.deepcopy(l1)
# l1[-1].append(666)
# print(l1,l2)
# print(id(l1[-1]),id(l2[-1]))

9、编码

   9.1编码历史及方式:

编码:
    ascii:字母,数字,特殊字符。
    万国码:unicode :
        A: 0000 0010 0000 0010 两个字节,表示一个字符。
       中: 0000 0010 0000 0010 两个字节,表示一个字符。
    升级:
        A: 0000 0010 0000 0010 0000 0010 0000 0010 四个字节,表示一个字符。
       中: 0000 0010 0000 0010 0000 0010 0000 0010 四个字节,表示一个字符。
       占空间,浪费资源。
   utf-8:最少用一个字节,表示一个字符.
        A: 0000 0010
     欧洲:0000 00100000 0010
     中文:0000 00100000 00100000 0010

    gbk国标。
        A: 0000 0010
        中: 0000 0010 0000 0010
        python3x:
            1,不同编码之间的二进制是不能互相识别的。
            2,python3x str内部编码方式(内存)为unicode
                但是,对于文件的存储,和传输不能用unicode
            bytes类型:内部编码方式(内存)为非unicode
           #对于英文
               str:
                s = 'laonanhai' 表现形式
                内部编码方式 unicode

                bytes:
                s1 = b'laonanhai'  表现形式
                内部编码方式 非unicode (utf-8,gbk,gb2312....)
            #对于中文:
                str:
                    s = '中国'
                    print(s,type(s))
                bytes:
                    s1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
                    print(s1,type(s1))

  9.2编码例子:

#对于英文
# s = 'laonanhai'
# print(s,type(s))
#
# s1 = b'laonanhai'
# print(s1,type(s1))

#对于中文:
# s = '中国'
# print(s,type(s))
#
# s1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
# print(s1,type(s1))

#转化
# s = 'laonanhai'
# s2 = s.encode('utf-8')  #str -->bytes encode 编码
# s3 = s.encode('gbk')
# print(s2,s3)
# s = '中国'
# s2 = s.encode('utf-8')  #str -->bytes encode 编码
# # s3 = s.encode('gbk')
# # print(s2)
# # print(s3)
# ss = s2.decode('utf-8')  # bytes ---> str decode 解码
# print(ss)

 10、zip函数的用法:

  10.1 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

                       如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

例子:
li = [1,2,3,4]
s='abdf'
d = 'qwer,def'
t={'name':1,'age':2,'a':2,'f':3}
for i in zip(li,s,d,t):
    print(i)

打印结果:
(1, 'a', 'q', 'name')
(2, 'b', 'w', 'age')
(3, 'd', 'e', 'a')
(4, 'f', 'r', 'f')

li = [1,2,3,4]
for i in zip(li[:],li[1:]):
print(i)
结果:

(1, 2)
(2, 3)
(3, 4)

  10.2 zip可以将字典的键值对互换然后存在列表中

例子:
t={'name':1,'age':2,'a':2,'f':3}
z = list(zip(t.values(),t.keys()))
print(z)
结果:
[(1, 'name'), (2, 'age'), (2, 'a'), (3, 'f')]
12、map 方法的用法:内置函数   遍历序列,对序列中每个元素进行操作,最终获取新的序列
  map() 会根据提供的函数对指定序列做映射。
  第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表
  
  语法:
map(function, iterable, ...)
    function -- 函数,有两个参数
    iterable -- 一个或多个序列
1、
>>>def square(x) : # 计算平方数 ... return x ** 2 ... >>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方 [1, 4, 9, 16, 25]
2、 和1 的结果一样,采用匿名定义函数,别叫方便
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数 [1, 4, 9, 16, 25] 3、 # 提供了两个列表,对相同位置的列表数据进行相加 >>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) [3, 7, 11, 15, 19]
#4、用map来处理字符串,将列表中的字符串统一加一个后缀_sb,比如:alex_sb
name = ['alex','wusir','taibai']
new_name= list(map(lambda i:i+'_sb',name))
5、字符串(str)、列表(list)、元组()tuble、集合(set)、列表中嵌套字典等都可以使用map
name='alex'
newname=list(map(lambda i:i+'_sb',name)) 或 newname=tuple(map(lambda i:i+'_sb',name))
l = [{'name':'alex'},{'name':'wusir'}]
l1 = list(map(lambda x:x['name'] + '_sb' , l))#x随意定义,x['name']取字典值
注:map的数据是什么类型?
6、使用map将  type_choices 中元组转成字典

 12、lambda 匿名函数














posted @ 2018-04-13 16:19  星光0009  阅读(283)  评论(0编辑  收藏  举报