一、数据与数据类型

  1 什么是数据?

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

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

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

  3 数据类型

   数字(int)

   字符串 (str)

   列表 (list)

   元组 (tuple)

   字典 (dict)

   集合 (set)

 

二、基础数据类型

  2.1数字 int

  数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以:

  


#bit_length() 当十进制用二进制表示时,最少使用的位数
a = 3
b = 5
print(a.bit_length())
print(b.bit_length())

结果如何下:
2
3

Process finished with exit code 0

换算如下:
二进制          十进制
0000 0001          1
0000 0010          2
0000 0011          3
View Code

 

 

  2.2 布尔值 bool

  布尔值就两种:True、False。就是反应条件的正确与否。

  
真  <==> 1 <==> True

  假  <==> 0 <==> False


  int --> str: str(int)

  str --> int: int(str)  #str必须全部是数字组成。


  int --> bool : 0 =False   非零=True

  bool --> int : int(True)=1  int(False)=0


  str  --> bool : ''(空) =False  非空字符串=True
View Code

 

  2.3 字符串 str

  2.3.1 字符串的所以与切片

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

a = 'ABCDKDSEKD'
print(a[0])
print(a[2])
print(a[-1])
print(a[-2])

结果为:
A
C
D
K

Process finished with exit code 0
View Code

 

  切片就是通过索引(索引:索引:步长)截取字符串的一段,形成新的字符串(原则就是顾头不顾尾)

a = 'ABCDKDSEKD'
print(a[0:3]) 
print(a[2:5])
print(a[0:])  #默认到最后
print(a[0:-1])  #-1就是最后一个
print(a[-1::-1])  #倒序,必须加反向步长
print(a[0:5:2])  #加步长 
print(a[5:0:-2])  #反向加步长

结果为:
ABC
CDK
ABCDKDSEKD
ABCDKDSEK
DKESDKDCBA
ACK
DDB

Process finished with exit code 0
View Code

 

  2.3.2 字符串的常用方法

 

s = 'qingSHANGlys' #定义一个字符串 s
1)# * capitalize 首字母大写,其他字母小写
print(s.capitalize())
结果为:
Qingshanglys


(2)# *** 全部大写upper() 全部小写lower()
print(s.upper())
print(s.lower())
结果为:
QINGSHANGLYS
qingshanglys

#注 upper 和lower可以实现验证码功能,如下:
code = 'QeAr'.upper()
your_code = input('请输入验证码:').upper()
if your_code == code:
    print('验证成功')
else:
    print('验证失败')


(3)#* 大小写反转 swapcase()
print(s.swapcase())
结果为:
QINGshangLYS


(4)#*非字母的元素隔开的每个单词首字母大写 title()
s = 'alex wusir*oldboy3taibia'
print(s.title())
结果为:
Alex Wusir*Oldboy3Taibia


(5)# center 居中,长度自己设定,可自定义填充物,默认填充物None
print(s.center(30))
print(s.center(30,'*'))
结果为:
     alex wusir*oldboy3taibia   
***alex wusir*oldboy3taibia***6)# *** startswith 判断是否以...开头 可切片
   # *** endswith判断是否以...结尾 可切片
s = 'qingSHANGlys'

print(s.startswith('qi',0,2))
print(s.startswith('Q'))
print(s.endswith('s'))
print(s.endswith('S'))
结果为:
True
False
True
False

(7)# *** strip 去除首尾的空格,制表符\t,换行符。不仅仅是去除空格....(lstrip()只去除左边、 rstrip()只去除右边)
s = ' tyoyldBoyrtet '


print(s)
s1 = s.strip()
print(s1)
print(s1.strip('t')) #去除首尾的‘t’
结果为:
  tyoyldBoyrtet  
tyoyldBoyrtet
yoyldBoyrte

(8)*** split  (str ---> list) 以什么分割,最终形成一个列表此列表不含有这个分割的元素。

s='liuyisai,lys,qingshan'
print(s.split(','))
print(s.split('s'))
print(s.split('s',2))  #指定分隔符服个数

结果为:
['liuyisai', 'lys', 'qingshan']
['liuyi', 'ai,ly', ',qing', 'han']
['liuyi', 'ai,ly', ',qingshan']


(9)#join 将list --->str
s1 = 'lys'
print('+'.join(s1))
s2 = ['lys','qingshan','liuyisai']
print('+'.join(s2))

结果为:
l+y+s
lys+qingshan+liuyisai


(10)#replace 替换
s1='lys say you beautiful'
s2 = s1.replace('lys','qingshan')
print(s2)

结果为:
qingshan say you beautiful


(11)#find 通过元素找索引  找不到返回-1
  # index 通过元素找索引 找不到报错
s = 'qingshanlys'
print(s.find('s'))  #4
print(s.find('lys'))  #8
print(s.find('b'))  #-1
print(s.index('y'))  #9
print(s.index('b'))  #报错

(12)#格式化输出format
res = '我叫{},今年{}岁,爱好{}'  
print(res)  #我叫{},今年{}岁,爱好{}
res='我叫{0}今年{1}岁,爱好{2},我依然叫{0}'.format('lys',25,'girl')
print(res)  #我叫lys今年25岁,爱好girl,我依然叫lys
res='我叫{name}今年{age}岁,爱好{hobby}'.format(hobby='gril', name='lys', age=25)
print(res)  #我叫lys今年25岁,爱好gril


(13)#公共方法:len 长度
        count  数量

s = 'fdsafasdfasdfsadf'

print(len(s))  #17
print(s.count('a')) #4
 


#####is系列

s = 'lys123'
print(s.isdigit())  #False  #字符串只由数字组成
print(s.isalpha())  #False  #字符串只由字母组成
print(s.isalnum())  #Ture  #字符串由字母或数字组成

s = input('请输入数字:').strip() #删除前后空格
if s.isdigit():  #判断是否为数字
print('OK')
else:
print('erre')
 

 

  2.4列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:

  li = [‘lys’,123,Ture,(1,2,3,’wusir’),[1,2,3,’小明’,],{‘name’:’lys’}]

  列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据,32位python的限制是 536870912 个元素,64位python的限制是 1152921504606846975 个元素。而且列表是有序的,有索引值,可切片,方便取值。

li = ['lys',25,'boy','shandong']
print(li[0])    #lys
print(li[-1])    #shandong    -1代表最后一个元素的索引
print(li[:2])   #['lys', 25]     切片
print(li[:3:2])    #['lys', 'boy']    加步长

  

  2.4.1 list 赠

li = ['lys',25,'boy','shandong']

#append 在最后追加
li.append('girl')
li.append([1,2,3])
print(li)
结果为:
['lys', 25, 'boy', 'shandong', 'girl', [1, 2, 3]]


#insert 按照索引插入到指定位置
li.insert(0,'girl')
li.insert(2,[1,2,3])
print(li)
结果为:
['girl', 'lys', [1, 2, 3], 25, 'boy', 'shandong']


#extend 迭代着添加
li.extend('girl')
li.extend(['111',222,333])
print(li)
结果为['lys', 25, 'boy', 'shandong', 'g', 'i', 'r', 'l', '111', 222, 333]

  

  2.4.2 list 删

li = ['lys',25,'boy','shandong']
(1)#pop 有返回值  按照索引删除
print(li.pop(2))    
print(li)
结果为:
boy
['lys', 25, 'shandong']


(2)#remove 按照元素去删,没有返回值
print(li.remove('lys'))
print(li)
结果为:
None
[25, 'boy', 'shandong']


(3)#clear 清空列表
li.clear()
print(li)
结果为:
[]


(4)#del 内存级别删除列表,支持切片
del li
print(li)

#按索引删除
del li[-1]
print(li)
结果为:
['lys', 25, 'boy']

#切片删除
del li[:2]
print(li)
结果为:
['boy', 'shandong']

 

  2.4.3 list 改

li = ['lys',25,'boy','shandong']

#按照索引改
print(li[2])    #boy
li[2] = 'girl'
print(li)    #['lys', 25, 'girl', 'shandong']

#按照切片去改
li[:2] = 'abc'
print(li)
结果为:
['a', 'b', 'c', 'boy', 'shandong']
li[1:3] = [111,222,333,444]
print(li)
结果为:
['lys', 111, 222, 333, 444, 'shandong']

 

  2.4.4 list 查

li = ['lys',25,'boy','shandong']

#按照索引去查询
print(li[0])   #lys 

#按照切片去查询
print(li[1:3])    #[25, 'boy']

#循环查询
for i in li:
    print(i)

 

  2.4.5 list 其他操作

li = [1,2,3,1,2,2,2,3,1]

(1)#count 统计某个元素在列表中出现的次数
print(li.count(2))    #4


(2)#len 统计元素总个数
print(len(li))    #9


(3)sort 用于在原位置对列表进行排序
l2 = [3,2,4,6,9,8,7,1]
l2.sort()    #默认从小到大排序        
print(l2)    #[1, 2, 3, 4, 6, 7, 8, 9]

l2.sort(reverse=True)    #从大到小排序
print(l2)    #[9, 8, 7, 6, 4, 3, 2, 1]


(4)#reverse 将列表中的元素反向存放
l2.reverse()
print(l2)    #[1, 7, 8, 9, 6, 4, 2, 3]


(5)#index 用于从列表中找出某个值第一个匹配项的索引位置
print(li.index(2))    #1

 

2.5 字典dict

  字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。

  字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。

  key:不可变的数据类型(可哈希):str,bool,tuple,int。
      value:任意数据类型。
          数据类型分类:
              不可变的数据类型(可哈希):str,bool,tuple,int
              可变的数据类型:dict,list,set。               容器类数据类型:list,tuple,dict,set.
     字典:存储数据多,关系型数据,查询速度快(二分查找)。
     3.6版本之前,字典是无序的,3.6之后字典是有序的。

 

  2.5.1 字典dict 赠

dic = {'name':'lys','age':25,'hobby':'girl'}

(1)dic['high'] = 178    #有则覆盖,无则添加
print(dic)    #{'name': 'lys', 'age': 25, 'hobby': 'girl', 'high': 178}
dic['name'] = '青衫'
print(dic)    #{'name': '青衫', 'age': 25, 'hobby': 'girl'}


(2)#setdefault() 有则不变,无则添加
dic.setdefault('high',178)
print(dic)    #{'name': 'lys', 'age': 25, 'hobby': 'girl', 'high': 178}
dic.setdefault('name','青衫')
print(dic)    #{'name': 'lys', 'age': 25, 'hobby': 'girl'}

 

  2.5.2 字典dict 删

dic = {'name':'lys','age':25,'hobby':'girl'}

(1)#pop('key') 删除指定的健,有返回值、返回对应的值
print(dic.pop('hobby'))    #girl
print(dic)    #{'name': 'lys', 'age': 25}


(2)#clear()   清空
dic.clear()
print(dic)    #{}


(3)#popitem() 随机删除,返回值{3.6及以后版本删除最后一个值,不再随机}
print(dic.popitem())    #('hobby', 'girl')
print(dic)    #{'name': 'lys', 'age': 25}


(4)#del 内存级别删除
del dic['age']    
print(dic)    #{'name': 'lys', 'hobby': 'girl'}
del dic    
print(dic)    #已找不到该字典

 

  2.5.3 字典dict 改

dic = {"name":"jin","age":18,"sex":"male"}
dic2 = {"name":"alex","weight":75}
dic.update(dic2) #update() 将dic所有的键值对覆盖添加(相同的覆盖,没有的添加)到dic2中

结果为:{'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75}

 

  2.5.4 字典dict 查

dic = {'name':'lys','age':25,'hobby':'girl'}

print(dic['name'])     #lys
print(dic['name1'])    #报错    so: 没有会报错
print(dic.get('hobby'))    #girl
print(dic.get('hobby1'))    #None  
print(dic.get('hobby1','没有此值'))    #没有此值    so:查不到返回指定的值,默认为None

 

  2.5.5 字典dict的其他操作

dic = {'name':'lys','age':25,'hobby':'girl'}

(1)#items()    
item = dic.items()
print(item,type(item))
结果为:
dict_items([('name', 'lys'), ('age', 25), ('hobby', 'girl')]) <class 'dict_items'>    #这个类型就是dict_items类型,可迭代的

for i in dic:
    print(i)
结果为:#循环取出dic 所以的key
name
age
hobby


for i in dic.items():
    print(i)
结果为:
('name', 'lys')
('age', 25)
('hobby', 'girl')
for k,v in dic.items():
print(k,v)
结果为:
name lys
age 25
hobby girl
(
2)keys() for i in dic.keys(): print(i) 结果为: #循环取出字典dic的所以key name age hobby (3)values() for i in dic.values(): print(i) j结果为:循环取出字典dic的所以value lys 25 girl

 

 

  2.6 元组 tulpe

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

tu = (11,2,True,[2,3,4],'lys')
for i in tu:    
    print(i)
结果为:
11
2
True
[2, 3, 4]
lys


print(tu[2])    #True

print(tu.index('lys'))    #4

tu[-2].append(666)  #子不可变,孙看变
print(tu)    #(11, 2, True, [2, 3, 4, 666], 'lys')

 

 

  2.7 集合 set

  集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

    去重,把一个列表变成集合,就自动去重了。

    关系测试,测试两组数据之前的交集、差集、并集等关系。

 

  2.7.1 集合的创建

set1 = {1,2,3,4}
set2 = {'a','b','c'}
print(set1,set2)

结果为:
{1, 2, 3, 4} {'a', 'c', 'b'}

 

  2.7.2 集合的赠

set1 = {'lys','qingshan','liuyisai','liu'}

set1.add(666)    #位置随机
print(set1)    #{'liuyisai', 'lys', 'liu', 666, 'qingshan'}

set1.update('abc')    #迭代着增加
print(set1)    #{'liuyisai', 'lys', 'liu', 'c', 'a', 'b', 666, 'qingshan'}

set1.update(['a1','b2','c3'])
print(set1)    #{'lys', 'liuyisai', 'c3', 'b2', 'liu', 'a1', 'qingshan'}

 

  2.7.3 集合的删

set1 = {'lys','qingshan','liuyisai','liu'}

set1.remove('liuyisai')    #删除一个指定元素
print(set1)    #{'liu', 'lys', 'qingshan'}

set1.pop()    #随机删除一个元素
print(set1)

set1.clear()    #清空集合
print(set1)    #set()

del set1    #删除集合
print(set1)

 

  2.7.4 集合的去重功能

list = ['a','b','a',1,1,1,2]
print(set(list))    #{1, 2, 'b', 'a'}

 

  2.7.5 集合的交集(&  或者 intersection)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}

print(set1 & set2)    #{4, 5}

 

  2.7.6 集合的并集 (| 或者 union)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}

print(set1 | set2)    #{1, 2, 3, 4, 5, 6, 7, 8}

 

  2.7.7 集合的差集 (- 或者 difference)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}

print(set1 - set2)    #{1, 2, 3}

 

  2.7.8 集合的反交集

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}

print(set1 ^ set2)
结果为:
{1, 2, 3, 6, 7, 8}

 

 2.7.9 集合子集与超集

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))  # 这两个相同,都是说明set2是set1超集。

 

  2.7.10 frozenset 不可变集合,让集合变成不可变类型。

s = frozenset('barry')
print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

 

 

 

三、其他(enumerate,range,以及分别赋值等)

  enumerate :枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。

li =['lys','qingshan','linux','python','DB']

for i in enumerate(li):
    print(i)
结果为:
(1, 'qingshan')
(2, 'linux')
(3, 'python')
(4, 'DB')


for index,name in enumerate(li):
    print(index,name)
结果为:
0 lys
1 qingshan
2 linux
3 python
4 DB


for index,name in enumerate(li,5):    #默认从0开始,可以指定起始位置
    print(index,name)
结果为:
5 lys
6 qingshan
7 linux
8 python
9 DB

 

  range:指定范围,生成指定数字,配合for循环使用,不能直接print

for i in range(10):    #默认从0开始,顾头不顾尾
    print(i)
结果为:
0
1
2
3
4
5
6
7
8
9

for i in range(5,10): #指定起始位置 顾头不顾尾
    print(i)
结果为:
5
6
7
8
9

for i in range(5,10,2):    #支持步长
    print(i)
结果为:
5
7
9

for i in range(5,1,-1):    #反向打印
    print(i)
结果为:
5
4
3
2

 

  fromkeys

dic1 = dict.fromkeys('abc','张三')
print(dic1)
dic2= dict.fromkeys([1,2,3],'李四')
print(dic2)

结果为:
{'a': '张三', 'b': '张三', 'c': '张三'}
{1: '李四', 2: '李四', 3: '李四'}

dic3 = dict.fromkeys('abc',[])
# print(dic3)
dic3['a'].append('老男孩')
print(dic3)


结果为:
{'a': ['老男孩'], 'b': ['老男孩'], 'c': ['老男孩']}

 

 

四、数据类型补充

l1 = ['alex', 'wusir', 'taibai', 'barry', '老男孩']

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
#再循环一个列表时,不要对列表进行删除的动作(改变列表元素的个数动作),会出错


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

#tu 如果元组里面只有一个元素并且没有逗号隔开,那么他的数据类型与该元素一致。
tu1 = (1)
print(tu1,type(tu1))
tu2 = ('alex')
print(tu2,type(tu2))

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

 

 

五、深浅copy

  1 先看赋值运算。

l1 = [1,2,3,['barry','alex']]
l2 = l1
l1[0] = 5
l1[3][1] = 'lys'
print(l1)    #[5, 2, 3, ['barry', 'lys']] 34404952
print(l2)    #[5, 2, 3, ['barry', 'lys']] 34404952

对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。

 

  2、浅拷贝copy。

l1 = [1,2,3,['barry','alex']]
l2 = l1.copy()
l1[3][1] = 'lys'
l1[0] = 5
print(l1,id(l1))    #[5, 2, 3, ['barry', 'lys']] 6617688
print(l2,id(l2))    #[1, 2, 3, ['barry', 'lys']] 6617768
print(id(l1[3]))    #34862664
print(id(l2[3]))    #34862664

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

 

  3、深拷贝deepcopy。

import copy
l1 = [1,2,3,['barry','alex']]
l2 = copy.deepcopy(l1)
l1[3][1] = 'lys'
l1[0] = 5
print(l1)    #[5, 2, 3, ['barry', 'lys']]
print(l2)    #[1, 2, 3, ['barry', 'alex']]

对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。

 

posted on 2018-04-13 23:19  青衫lys  阅读(256)  评论(0编辑  收藏  举报