码迷,mamicode.com
首页 > 编程语言 > 详细

python 基础第七篇

时间:2018-08-16 22:28:25      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:彩票   %s   imp   导致   记录   哈希   python 基础   不重复   ict   

一. 补充基础数据类型的相关知识点

  1. str. join() 把列表变成字符串
  2. 列表不能再循环的时候删除. 因为索引会跟着改变
  3. 字典也不能直接循环删除.把要删除的内容记录在列表中. 循环列表. 删除原列表, 字典中的数据
  4. fromkeys() 不会对原来的字典产生影响. 产生新字典(神坑, 考试)
  5. set集合. 不重复, 无序.
  6. 想转换成什么.就用什么括起来
  7. 深浅拷贝
  • 直接赋值. 两个变量指向同一个对象.
  • 浅拷贝:只拷贝第一层内容. copy()
  • 深度拷贝: 对象中的所有内容都会被拷贝一份

import copy
copy.deepcopy()

07. 万恶之源-set集合,深浅拷贝以及部分知识点补充
本节主要内容:

  1. 基础数据类型补充
  2. set集合
  3. 深浅拷?

主要内容:
?. 基础数据类型补充
?先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的??看?看就可以了.
我们补充给?个字符串基本操作

s = "corn".join(["王者荣耀","LOL",‘CS‘,‘DOTA‘,‘魔兽世界‘])
print(s)

列表:
循环删除列表中的每?个元素

技术分享图片
lst = [‘周杰伦‘,‘周润发‘,‘周星星‘,‘马化腾‘,‘周树人‘]
l = []
for i in lst:
    if i.startswith("周"):
        l.append(i)
for i in l:
    lst.remove(i)
print(lst)
技术分享图片

注意: 由于删除元素会导致元素的索引改变, 所以容易出现问题. 尽量不要再循环中直接去删 除元素. 可以把要删除的元素添加到另?个集合中然后再批量删除.

字典同上:

技术分享图片
# 字典也不能在循环的时候更改大小
dic = {"a":"123", "b":"456"}
for k in dic:
    dic.setdefault("c", "123")

a = dict.fromkeys(["jj", ‘jay‘, ‘taibai‘], "sb")  # 静态方法


dic = {"a":"123"}
s = dic.fromkeys("王健林", "思聪" ) # 返回给你一个新字典
print(s)
技术分享图片

类型转换:
元组 => 列表 list(tuple)
列表 => 元组 tuple(list)
list=>str str.join(list)
str=>list str.split()
转换成False的数据:
0,‘‘,None,[],(),{},set() ==> False

 

?. set集合
set集合是python的?个基本数据类型. ?般不是很常?. set中的元素是不重复的.?序的.?
?的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记. set就是dict类型的数据但
是不保存value, 只保存key. set也?{}表?
注意: set集合中的元素必须是可hash的, 但是set本?是不可hash得. set是可变的.

set1 = {‘1‘,‘alex‘,2,True,[1,2,3]} # 报错
set2 = {‘1‘,‘alex‘,2,True,{1:2}} # 报错
set3 = {‘1‘,‘alex‘,2,True,(1,2,[2,3,4])} # 报错

set中的元素是不重复的, 且?序的.

s = {"周杰伦", "周杰伦", "周星星"}
print(s)
# 结果:
# {‘周星星‘, ‘周杰伦‘}

使?这个特性.我们可以使?set来去掉重复

# 给list去重复
lst = [45, 5, "哈哈", 45, ‘哈哈‘, 50]
lst = list(set(lst)) # 把list转换成set, 然后再转换回list
print(lst)

set集合增删改查
1. 增加

技术分享图片
s = {"刘嘉玲", ‘关之琳‘, "王祖贤"}
s.add("郑裕玲")
print(s)
s.add("郑裕玲") # 重复的内容不会被添加到set集合中
print(s)
s = {"刘嘉玲", ‘关之琳‘, "王祖贤"}
s.update("麻花藤") # 迭代更新
print(s)
s.update(["张曼?", "李若彤","李若彤"])
print(s)
技术分享图片

2. 删除

技术分享图片
s = {"刘嘉玲", ‘关之琳‘, "王祖贤","张曼?", "李若彤"}
item = s.pop() # 随机弹出?个.
print(s)
print(item)
s.remove("关之琳") # 直接删除元素
# s.remove("??疼") # 不存在这个元素. 删除会报错
print(s)
s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和dict区分的.
print(s) # set()
技术分享图片

3. 修改

技术分享图片
# set集合中的数据没有索引. 也没有办法去定位?个元素. 所以没有办法进?直接修改.
# 我们可以采?先删除后添加的?式来完成修改操作
s = {"刘嘉玲", ‘关之琳‘, "王祖贤","张曼?", "李若彤"}
# 把刘嘉玲改成赵本?
s.remove("刘嘉玲")
s.add("赵本?")
print(s)
技术分享图片

4. 查询

# set是?个可迭代对象. 所以可以进?for循环
for el in s:
 print(el)

5. 常?操作

技术分享图片
s1 = {"刘能", "赵四", "???"}
s2 = {"刘科?", "冯乡?", "???"}
# 交集
# 两个集合中的共有元素
print(s1 & s2) # {‘???‘}
print(s1.intersection(s2)) # {‘???‘}
# 并集
print(s1 | s2) # {‘刘科?‘, ‘冯乡?‘, ‘赵四‘, ‘???‘, ‘刘能‘}
print(s1.union(s2)) # {‘刘科?‘, ‘冯乡?‘, ‘赵四‘, ‘???‘, ‘刘能‘}
# 差集
print(s1 - s2) # {‘赵四‘, ‘刘能‘} 得到第?个中单独存在的
print(s1.difference(s2)) # {‘赵四‘, ‘刘能‘}
# 反交集
print(s1 ^ s2) # 两个集合中单独存在的数据 {‘冯乡?‘, ‘刘能‘, ‘刘科?‘, ‘赵四‘}
print(s1.symmetric_difference(s2)) # {‘冯乡?‘, ‘刘能‘, ‘刘科?‘, ‘赵四‘}
s1 = {"刘能", "赵四"}
s2 = {"刘能", "赵四", "???"}
# ?集
print(s1 < s2) # set1是set2的?集吗? True
print(s1.issubset(s2))
# 超集
print(s1 > s2) # set1是set2的超集吗? False
print(s1.issuperset(s2))
技术分享图片

set集合本?是可以发?改变的. 是不可hash的. 我们可以使?frozenset来保存数据. frozenset是不可变的. 也就是?个可哈希的数据类型

s = frozenset(["赵本?", "刘能", "???", "?跪"])
dic = {s:‘123‘} # 可以正常使?了
print(dic)

这个不是很常?. 了解?下就可以了

三. 深浅拷?

技术分享图片
lst1 = ["??狮王", "紫衫?王", "?眉鹰王", "?翼蝠王"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("杨逍")
print(lst1)
print(lst2)
#结果:
[‘??狮王‘, ‘紫衫?王‘, ‘?眉鹰王‘, ‘?翼蝠王‘, ‘杨逍‘]
[‘??狮王‘, ‘紫衫?王‘, ‘?眉鹰王‘, ‘?翼蝠王‘, ‘杨逍‘]
dic1 = {"id": 123, "name": "谢逊"}
dic2 = dic1
print(dic1)
print(dic2)
dic1[‘name‘] = "范瑶"
print(dic1)
print(dic2)
#结果:
{‘id‘: 123, ‘name‘: ‘谢逊‘}
{‘id‘: 123, ‘name‘: ‘谢逊‘}
{‘id‘: 123, ‘name‘: ‘范瑶‘}
{‘id‘: 123, ‘name‘: ‘范瑶‘}
技术分享图片

对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制?份内容. 所以. lst1的内存指向和lst2是?样的. lst1改变了, lst2也发?了改变

浅拷?

技术分享图片
lst1 = ["何炅", "杜海涛","周渝?"]
lst2 = lst1.copy()
lst1.append("李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
#结果:
#两个lst完全不?样. 内存地址和内容也不?样. 发现实现了内存的拷?
lst1 = ["何炅", "杜海涛","周渝?", ["麻花藤", "?芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("?敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
#结果:
[‘何炅‘, ‘杜海涛‘, ‘周渝?‘, [‘麻花藤‘, ‘?芸‘, ‘周笔畅‘, ‘?敌是多磨寂寞‘]]
[‘何炅‘, ‘杜海涛‘, ‘周渝?‘, [‘麻花藤‘, ‘?芸‘, ‘周笔畅‘, ‘?敌是多磨寂寞‘]]
4417248328 4417248328
技术分享图片

浅拷?. 只会拷?第?层. 第?层的内容不会拷?. 所以被称为浅拷?

深拷?

技术分享图片
import copy
lst1 = ["何炅", "杜海涛","周渝?", ["麻花藤", "?芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("?敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
#结果:
[‘何炅‘, ‘杜海涛‘, ‘周渝?‘, [‘麻花藤‘, ‘?芸‘, ‘周笔畅‘, ‘?敌是多磨寂寞‘]]
[‘何炅‘, ‘杜海涛‘, ‘周渝?‘, [‘麻花藤‘, ‘?芸‘, ‘周笔畅‘]]
4447221448 4447233800
技术分享图片

都不?样了. 深度拷?. 把元素内部的元素完全进?拷?复制. 不会产??个改变另?个跟着改变的问题

补充?个知识点:

最后我们来看?个?试题:

a = [1, 2]
a[1] = a
print(a[1])

作业;

一.判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方
的和还等于这个数. 那这个数就是一个水仙花数, 例如: 153 = 1**3 + 5**3 + 3**3
技术分享图片
h = 0
s = input("请随机输入一个三位数:")
for i in s:
    h = h + int(i) ** 3
if h == int(s):
    print(‘这是水仙花数‘)
else:
    print("不是水仙花数")
技术分享图片
二.给出一个纯数字列表. 请对列表进行排序(升级题).
思路:
1.完成a和b的数据交换. 例如, a = 10, b = 24 交换之后, a = 24, b = 10
2.循环列表. 判断a[i]和a[i+1]之间的大小关系, 如果a[i]比a[i+1]大. 则进行互换.
循环结束的时候. 当前列表中最大的数据就会被移动到最右端.
3.想一想, 如果再次执行一次上面的操作. 最终第二大的数据就移动到了右端. 以此类推.
如果反复的进行执行相应的操作. 那这个列表就变成了一个有序列表.
ls = [10, 12, 32, 45, 88, 5, 96, 58, 3, 45]
for i in range(1, len(ls)):
    for j in range(0,len(ls)-i):
        if ls[j] > ls[j+1]:
            ls[j], ls[j+1] = ls[j+1], ls[j]
print(ls)

三.完成彩票36选7的功能. 从36个数中随机的产生7个数. 最终获取到7个不重复的数据作为最终的开奖结果.
随机数: 
from random import randint
randint(0, 20) # 0 - 20 的随机数

from random import randint
s = set()
a = 1
while int(len(s)) < 7:
    s.add(randint(1, 36))
print(s)
四. 税务部门征收所得税. 规定如下: 
        1). 收入在2000以下的. 免征.
        2). 收入在2000-4000的, 超过2000部分要征收3%的税. 
        3). 收入在4000-6000的, 超过4000部分要征收5%的税.
        4). 收入在6000-10000的, 超过6000部分要征收8%的税.  
        4). 收入在10000以上的, 超过部分征收20%的税. 
    注, 如果一个人的收入是8000, 那么他要交2000到4000的税加上4000到6000的税加上6000到8000的税. 
        收入 = 8000-(4000-2000)*3%-(6000-4000)*4%-(8000-6000)*8%
让用户输入它的工资, 计算最终用户拿到手是多
技术分享图片
s = float(input(‘请输入你的工资:‘))
if s <= 2000:
    print("你最终的工资为:%s" % s)
elif s > 2000 and s <= 4000:
    a = s - (s - 2000)*0.03
    print("你最终的工资为:%s" % a)
elif s > 4000 and s <= 6000:
    a = s - (s - 4000)*0.05-(4000-2000)*0.03
    print("你最终的工资为:%s" % a)
elif s >6000 and s <= 8000:
    a = s - (s - 6000)*0.08-(6000-4000)*0.05-(4000-2000)*0.03
    print("你最终的工资为:%s" % a)
else:
    a = s - (s - 8000)*0.2-(8000-6000)*0.08-(6000-4000)*0.05-(4000-2000)*0.03
    print("你最终的工资为:%s" % a)

python 基础第七篇

标签:彩票   %s   imp   导致   记录   哈希   python 基础   不重复   ict   

原文地址:https://www.cnblogs.com/python119/p/9490258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!