Python基础(二)

列表(list)

列表的创建

数值类型:int float long
布尔型:bool
字符串类型:str
列表:list

数组:存储同一种数据类型的集合
列表(打了激素的数组):可以存储任意数据类型的集合

列表
li = [1,2.2,True,'hello']
print(li,type(li))
列表里面嵌套列表:
li = [1,2.2,True,'hello',[1,2,3,4]]
print(li,type(li))
生成随机数列表
import random
li = list(range(10))
random.shuffle(li)
print(li)

打印菱形

代码:

n = int(input('NUM:'))
for i in range(1,2*n,2):
    print(('*' * i).center(3 * n))
s = range(1,2*(n-1),2)
for i in s[::-1]:
    print(('*' * i).center(3 * n))

运行结果:
在这里插入图片描述

列表的特性

定义列表
 service = ['http','ssh','ftp']

索引

#正向索引
print(service[0])
#反向索引
print(service[-1])

在这里插入图片描述
切片

print(service[::-1])  # 列表的反转
print(service[1::])   # 除了第一个之外的其他元素
print(service[:-1])   # 除了最后一个之外的其他元素

在这里插入图片描述

重复

print(service * 3)

在这里插入图片描述
连接

service1 = ['mysql','firewalld']
print(service + service1)

在这里插入图片描述 for循环

for i in service:
	print(i)

在这里插入图片描述
成员操作符

print('firewalld' in service)
print('ftp' in service)
print('firewalld' not in service)
print('ftp' not in service)

在这里插入图片描述

列表里面嵌套列表
service2 = [['http',80],['ssh',22],['ftp',21]]

索引

print(service2[0][0])
print(service2[-1][1]) 

在这里插入图片描述

练习:

1.根据用于指定月份,打印该月份所属的季节。
----提示: 3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季

代码:

month = int(input('Month:'))
if month in [3,4,5]:
    print('春季')
elif month in [6,7,8]:
    print('夏季')
elif month in [9,10,11]:
    print('秋季')
else:
    print('冬季')

运行结果:
在这里插入图片描述
2.假设有下面这样的列表:
----names = [‘fentiao’,‘fendai’,‘fensi’,‘fish’]
----输出的结果为:‘I have fentiao,fendai,fensi and fish’

代码:

names = ['fentiao','fendai','fensi','fish']
print('I have ' + ','.join(names[:-1]) + ' and ' + names[-1])

运行结果:
在这里插入图片描述

列表元素的添加

service = ['http', 'ssh', 'ftp']
连接
print(service + ['firewalld'])

在这里插入图片描述

append:追加,追加一个元素到列表中
service.append('mysql')
print(service)

在这里插入图片描述

extend:拉伸,追加多个元素到列表中
service.extend(['hello','python'])
print(service)

在这里插入图片描述

insert:插入,在索引位置插入元素
service.insert(0,'firewalld')
print(service)

在这里插入图片描述

列表元素的删除

 service = ['http', 'ssh', 'ftp']
remove
service.remove('ftp')
print(service)    
#不能删除不存在的元素
#service.remove('https')
#print(service)

在这里插入图片描述

clear:清空列表中的所有元素
service.clear()
print(service)

在这里插入图片描述

del(python关键字):从内存中删除列表
#del service
#print(service)
print('删除列表第一个索引对应的值:',end='')
del service[1]
print(service)
print('删除前两个元素之外的其他元素:',end='')
del service[2:]
print(service)

在这里插入图片描述

pop:通过索引删除元素
service.pop(0)
print(service)
service.pop(-1)
print(service)

在这里插入图片描述

列表元素的修改

service = ['ftp','http', 'ssh', 'ftp']
通过索引(重新赋值)
service[0] = 'mysql'
print(service)

在这里插入图片描述

通过slice(切片)
service[:2] = ['mysql','firewalld']
print(service)

在这里插入图片描述

列表元素的查看

service = ['ftp','http','ssh','ftp','ssh','ssh']
查看元素出现的次数
print(service.count('ftp'))

在这里插入图片描述

查看指定元素的索引值(也可以指定范围)
print(service.index('ssh'))
print(service.index('ssh',1,3))

在这里插入图片描述

排序查看(按照ascii码进行排序)
#正向排序
service.sort()
print(service)
#反向排序
service.sort(reverse=True)
print(service)

在这里插入图片描述

字符串排序会区分大小写
names = ['alice','bob','tom','Barry']
names.sort()
print(names)
#对字符串排序不区分大小写
names.sort(key=str.lower)
print(names)
names.sort(key=str.upper)
print(names)

在这里插入图片描述

列表练习

栈的实现

stack = [1,2,3,4]
栈的工作原理:先进后出
入栈
出栈
栈顶元素
栈的长度
栈是否为空

代码:

stack = []
info = """
    操作目录
    1.入栈
    2.出栈
    3.栈顶元素
    4.栈的长度
    5.栈是否为空
    6.退出
"""
while True:
    print(info)
    choice = input('请输入你的选择:')
    if choice == '1':
        i = input('输入元素:')
        stack.append(i)
        print('元素%s入栈成功' % i)
    elif choice == '2':
        if len(stack) == 0:
            print('栈为空,不能出栈')
        else:
            i = stack.pop()
            print('元素%s出栈成功' % i)
    elif choice == '3':
        if not stack:
            print('栈为空,无栈顶元素')
        else:
            print('栈顶元素为%s' %(stack[-1]))
    elif choice == '4':
        print('栈的长度为:%s' %(len(stack)))
    elif choice == '5':
        if len(stack) == 0:
            print('栈为空')
        else:
            print('栈不为空')
    elif choice == '6':
        print('欢迎下次使用')
        break
else:
    print('请输入正确的操作!')

运行结果:
在这里插入图片描述

用户管理

1.系统里面有多个用户, 用户信息目前保存在列表里面;
users = [‘root’, ‘westos’]
passwds = [‘123’, ‘456’]
2.用户登陆(判断用户登陆是否成功):
1) 判断用户是否存在(inuser in users)
2) 如果存在:
----判断用户密码是否正确(先找出用户对应的索引值, 根据passwds[索引值]拿出该用户的码)
----如果正确: 登陆成功, 退出循环;
----如果密码不正确, 重新登陆, 总共有三次登陆机会
3.如果不存在:
----重新登陆, 总共有三次登陆机会

代码:

user = ['user1','user2']
passwds = ['123','456']
for i in range(3):
    inuser = input('用户名:')
    inpasswd = input('密码:')
    if inuser in user:
        index = user.index(inuser)
        passwd = passwds[index]
        if inpasswd == passwd:
            print('登录成功')
            break
        else:
            print('密码错误,登录失败')
    else:
        print('%s用户不存在,登录失败' % inuser)
else:
print('机会已经用完')

运行结果:
在这里插入图片描述

元组(tuple)

元组的创建

元组
列表:打了激素的数组
元组:带了紧箍咒的列表
     不可变数据类型,没有增删改查
     可以存储任意数据类型
定义元组
t = (1,1.2,True,'westos')
print(t,type(t))

#如果元组里面包含可变数据类型,可以间接修改元组内容
t1 = ([1,2,3],4)
t1[0].append(4)
print(t1)

#定义空元组    
t2 = ()
print(t2)

#列表和元组的转换
t3 = tuple([])
print(t3)
l4 = list(())
print(l4)      
  
#元组如果只有一个元素,后面一定要加逗号,否则数据类型不确定
t4 = (1,)
print(t4,type(t4))

元组的特性

tuple = (1, 2.2, True, 'westos')

# 索引
print(tuple[0])
print(tuple[-1])

# 切片
print(tuple[1:])
print(tuple[:-1])
print(tuple[::-1])

# 连接
# 不同数据类型可以连接吗(除了数值类型,不同的数据类型之间不能连接)
print(tuple + (1, 2, 3))
# print(tuple + [4,5,6])
# print(tuple + 'westos')

#重复
print(tuple * 3)

#成员操作符
print(1 in tuple)
print(1 not in tuple)

#for循环
for i in tuple:
    print(i)

元组的常用方法

t = (1,2,'a','c','a')

# 查看元素的索引值
print(t.index('c'))

# 查看元素在元组中出现的次数
print(t.count('a'))

元组的应用场景

1.变量交换数值

先把(a,b)封装成了一个元组 (1,2)
b,a = a,b ===> b,a = (1,2)
b = (1,2)[0] a =(1,2)[1]

a = 1
b = 2
b,a = a,b
print(a,b)

在这里插入图片描述

2.打印变量值
name = 'westos'
age = '18'
#直接打印变量值
print('name:%s,age:%s' %(name,age))
#应用元组打印变量值
t = (name,age)
print('name:%s,age:%s' %t)

在这里插入图片描述

3.元组的赋值
# 有多少个元素,就用多少个变量接收
t = ('westos',10,100)
name,age,score = t
print(name,age,score)

在这里插入图片描述

4.元组的排序
scores = (100,89,93,79,53,65)
  
#先将元组转换成列表
scoreli = list(scores)
scoreli.sort()
print(scoreli)
#sorted排序
score_sort = sorted(scores)
print(score_sort)

在这里插入图片描述

5.比赛计分器(列表)
#列表
#scores = [100,89,93,79,53,65]
#scores.sort()
#元组
scores = (100,89,93,79,53,65)
scores = sorted(scores)
min_score,*middle,max_score = scores
print('最终成绩:%s' %(sum(middle)/4))

在这里插入图片描述

浅拷贝和深拷贝

当一个变量 = xxx 的时候,约定为: 指向地址的过程
浅拷贝:copy.copy()
深拷贝:copy.deepcopy()

如果用copy.copy()拷贝的是元组,那么它不会进行浅拷贝,仅仅是指向,因为元组是不可变数据类型,那么意味着数据一定不能修改。
因此用copy.copy的时候它会自动判断,是指向

如果,用copy.copy() copy.deepcopy()对一个全部是不可变类型的数据进行数据拷贝,那么它们的结果相同,都是引用

如果拷贝的是一个拥有可变类型的数据,那么deepcopy依然是深拷贝,而copy.copy还是指向

In [13]: import copy

# 可变数据类型
In [14]: a = [11,22]    
In [15]: b = [33,44]    
In [16]: c = [a,b]

In [20]: d = copy.copy(c)
In [21]: e = copy.deepcopy(c)

In [22]: id(c)
Out[22]: 140061397861064

In [23]: id(d)
Out[23]: 140061397862728

In [24]: id(e)
Out[24]: 140061397240904

In [25]: id(c[0])
Out[25]: 140061389664328

In [26]: id(d[0])
Out[26]: 140061389664328

In [27]: id(e[0])
Out[27]: 140061396927816

#不可变数据类型
In [28]: a = (11,22)    
In [29]: b = (33,44)    
In [30]: c = (a,b)

In [31]: d = copy.copy(c)    
In [32]: e = copy.deepcopy(c)

In [33]: id(c)
Out[33]: 140061389613000

In [34]: id(d)
Out[34]: 140061389613000

In [35]: id(e)
Out[35]: 140061389613000

In [36]: id(c[0])
Out[36]: 140061370709384

In [37]: id(d[0])
Out[37]: 140061370709384

In [38]: id(e[0])
Out[38]: 140061370709384
    
#含可变数据类型
In [39]: a = [11,22]    
In [40]: b = [33,44]    
In [41]: c = (a,b)

In [42]: d = copy.copy(c)    
In [43]: e = copy.deepcopy(c)

In [44]: id(a)
Out[44]: 140061396446856

In [45]: id(c)
Out[45]: 140061396089480

In [46]: id(d)
Out[46]: 140061396089480

In [47]: id(e)
Out[47]: 140061396772296

In [48]: id(c[0])
Out[48]: 140061396446856

In [49]: id(d[0])
Out[49]: 140061396446856

In [50]: id(e[0])
Out[50]: 140061396443400

集合(set)

集合的定义

集和里面的元素是不可重复的
s = {1,2,3,4,5,6,6,3,3,2}
print(s,type(s))
s1 = {1}
print(s1,type(s1))

在这里插入图片描述
应用:列表去重

li = [1,2,3,4,1,2,3]
print(list(set(li)))

在这里插入图片描述

定义一个空集和
#默认是dict,称为字典
s2 = {}
print(s2,type(s2))
#定义空集和
s3 = set([])
print(s3,type(s3))

集合的特性

集合支持的特性只有 成员操作符 for循环(索引 切片 重复 连接 均不支持)

s = {1,3,5}

#成员操作符
print(1 in s)
print(1 not in s)

#for循环
for i in s:
    print(i,end=' ')
print()

#枚举(for + index)
for i,v in enumerate(s):
    print('index:%s\tvalue:%s' %(i,v))

集合的常用方法

s = {6, 7, 3, 1, 2, 3}

# 添加
# 添加顺序和在集合中的存储顺序不同
s.add(8)
print(s)
# 添加多个元素
s.update({9, 10, 11})
print(s)

# 删除
s.pop()
print(s)
# 删除指定元素(元素要存在)
s.remove(3)
print(s)


s1 = {1, 2, 3}
s2 = {2, 3, 4}

# 并集
print('并集:',s1.union(s2))
print('并集:',s1 | s2)

# 交集
print('交集:',s1.intersection(s2))
print('交集:',s1 & s2)

# 差集
# 可以理解为s1中有哪些s2中没有的元素
print('差集:',s1.difference(s2))  #s1 - (s1 & s2)
print('差集:',s1 - s2)
# 可以理解为s2中有哪些s1中没有的元素  #s2 - (s1 & s2)
print('差集:',s2.difference(s1))
print('差集:',s2 - s1)

# 对等差分:并集 - 交集
print('对等差分:',s1.symmetric_difference(s2))
print('对等差分:',s1 ^ s2)


s3 = {1, 2}
s4 = {1, 2, 3}

#s3是否为s4的子集(返回值为True/False)
print(s3.issubset(s4))

#s3是否为s4的超集(返回值为True/False)
#超集:如果一个集合s4中的每一个元素都在集合s3中,且集合s3中可能包含s4中没有的元素,则集合s3就是s4的一个超集
print(s3.issuperset(s4))

#两个集合是不是不相交(返回值为True/False)
print(s3.isdisjoint(s4))

集合练习

去重排序
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1~1000之间的随机整数(N<=1000),N是用户输入的,对于其中重复的数字,只保留一个,把其余相同的数字去掉,不同的数对应着不同学生的学号,然后再把这些数从小到大排序,按照排好的顺序去找同学做调查

代码:

import random
#生成n个随机数
#优先选择集合
N = int(input('请输入一个不大于1000的整数:'))
s = set([])
for i in range(N):
    s.add(random.randint(1,1000))
print(sorted(s))

运行结果:
在这里插入图片描述

字典(dict)

字典的创建

字典

key-value 键值对存储的一种数据结构
value值可以是任意数据类型:int / float / long / list / tuple / set / dict

# 定义空字典
d = {}
print(type(d))

# list
d1 = {
    '王超':[18,'男','玩手机'],
    '王凯':[18,'男','修手机']
}
print(d)
print(d['王凯'])

# int
d2 = {
    'a':1,
    'b':2
}
print(d2)

# set
d3 = {

    'a':{1,2,3},
    'b':{2,3,4}
}
print(d3)
字典的嵌套
students = {
    '06163012':{
        'name':'王凯',
        'age':18,
        'score':90
    },
    '03162003':{
        'name':'管良虎',
        'age':19,
        'score':80
    }
}

print(students['03162003']['name'])
fromkeys创建字典

fromkeys第一个参数可以是 list / tuple / str / set
将第一个参数的元素作为字典的key值,并且所有key的value值一致

d4 = {}.fromkeys({'1','2','3'},'a'))
print(d4)
工厂函数
d5 = dict(a=1,b=2)
print(d5)

字典的特性

d = {
    '1': 'a',
    '2': 'b',
    '3': 'c'
}

# 查找key值对应的value值
print(d['1'])
# 字典不支持索引
# print(d[0])

# 字典不支持切片
# print(d[::-1])

# 字典的重复和连接是无意义的,字典的key是唯一的

# 成员操作符:判断的是 某个值是否为字典的key
print('1' in d)
print('1' not in d)

# for循环
# 默认遍历字典的key值
for key in d:
    print(key)
# 遍历字典
for key in d:
    print(key,d[key])

字典的增加

 services = {
    'http':80,
    'ftp':21,
    'ssh':22
}
1.添加一个元素

----如果key值不存在,则添加对应的key-value值
----如果key值存在,则更新对应的key值

services['mysql'] = 3306
print(services)

services['http'] = 443
print(services)
2.添加多个key-value值

----如果key值不存在,则添加对应的key-value值
----如果key值存在,则更新对应的key值

services_backup = {
    'tomcat':8080,
    'https':443,
    'http':8888
}

services.update(services_backup)
print(services)

services.update(flask=9000,http=999)
print(services)
3.setdefault添加key值:

----如果key值不存在,则添加对应的key-value值
----如果key值存在,则不做修改

services.setdefault('oracle',44575)
print(services)

services.setdefault('http',9000)
print(services)

字典的删除

 services = {

    'http': 80,
    'ftp': 21,
    'ssh': 22,
    'mysql': 3306
}
1.del关键字
 del services['http']
 print(services)
2.pop删除指定的key-value值
# 如果key存在,删除并返回删除key对应的value值
item = services.pop('http')
print(item)
print(services)
# 如果key不存在,直接报错
# item = services.pop('https')
# print(item)
# print(services)
3.popitem删除最后一个key-value值
item = services.popitem()
print('删除的key-value对应的是:',item)
print(services)
4.清空字典内容
services.clear()
print(services)

字典的查看和修改

service = {
    'http': 80,
    'mysql': 3306
}

# 查看字典里的key值
print(service.keys())

# 查看字典里的value值
print(service.values())

# 遍历字典
for k, v in service.items():
    print(k, '---->', v)
for k in service:
    print(k, '---->', service[k])

# 查看指定key对应的value值
print(service['http'])
# key值不存在,程序会报错
# print(service['https'])

# get查看指定key对应的value值
#如果key值存在,返回对应的value值
print(service.get('http'))
#如果key值不存在,默认返回None,如果需要指定返回值,传值即可
print(service.get('https'))
print(service.get('https','Not is exist'))

字典练习

随机生成100个卡号;
----卡号以6102009开头, 后面3位依次是 (001, 002, 003, 100),
生成关于银行卡号的字典, 默认每个卡号的初始密码为"redhat";
输出卡号和密码信息, 格式如下:

卡号密码
6102009001000000

代码:

# 存储所有卡号列表,也可以通过集合来存储
card_ids = []

# 生成100个卡号
for i in range(100):
    # %.3d代表这个整型数占3位 eg:1--->001
    s = '6102009%.3d' %(i+1)
    # 将每次生成的卡号都加入到列表中
    card_ids.append(s)

card_ids_dict = {}.fromkeys(card_ids,'redhat')

print('卡号\t\t\t\t\t密码')
for key in card_ids_dict:
    print('%s\t\t\t%s' %(key,card_ids_dict[key]))

运行结果:
在这里插入图片描述

python内置数据结构总结

数据类型

数值(int float)
bool
str
list tuple set dict

可变数据类型和不可变数据类型

可变数据类型:list set dict
不可变数据类型:tuple
判断依据:是否可以增删改查

有序数据类型和无序数据类型

有序数据类型:str list tuple
无序数据类型:数值 bool set
python2:dict无序 python3中:dict有序

一般情况下:有序数据类型可以索引,切片,连接,重复 但是字典除外
	  可以for循环数据结构
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值