Python学习第十天——元组、集合、字典
2018-03-08 19:55
495 查看
""" 约瑟夫环 30个人出海去玩,船瓦特了,要弄死15个人,其他人才能活下来,围成一圈,报数1,2,3..., 谁报到9就弄死谁, 以此类推. 直到剩下15个人为止.其中15个人是基督徒,其他15个不是基督徒, 求这些人的站位. """
def main(): persons = [True] * 30 counter = 0 index = 0 number = 0 while counter < 15: if persons[index]: number += 1 if number == 9: persons[index] = False counter += 1 number = 0 index += 1 index %= 30 #让index在循环到30时回到0 for person in persons: print('基'if person else '非',end = '') main()
基基基基非非非非非基基非基基基非基非非基基非非非基非非基基非
回顾
函数
把相对独立和将来要重复使用的写成函数def f(a=0, b=0): return a + b f() f(1) f(1, 100) def f(*args): total = 0 for val in args: total += val return total mylist = [1, 3, 5, 10, 20] print(f(*mylist)) #把列表的元素当成可变元素传入列表,需要在传入时加上‘*’
作用域 - LEGB
a = 100 def f(): global a #搜索全局作用域里的a a = 200 b = 'hello' def g(): nonlocal b#搜索嵌套作用域里的b b = 'good'
def f(*args): total = 0 for val in args: total += val return total mylist = [1, 3, 5, 10, 20] print(f(*mylist))
39
模块
from as import单一职责原则,只把功能相关的函数放在一个模块
字符串
函数和方法的使用列表
一个变量可以放多个元素mylist = [x ** 2 for x in range(1, 10)] mylist = mylist + [20, 30]
mylist = [x ** 2 for x in range(1, 10)] mylist = mylist + [20, 30]#添加元素的方法 print(mylist)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 20, 30]
内存管理
栈 - 变量 - 地址 - 对象的引用堆 - 真正的对象
id()
is
静态区
#自动内存管理机制 #垃圾回收机制 import sys list1 = [0] * 10 list2 = list1 list3 = list1 #此时由于有变量在引用对象,就不会被处理 print(sys.getsizeof(list1)) print(sys.getrefcount(list1))#查看引用计数,会比实际多一个 del list2#删除list2的引用 del list3 del list1[0] print(sys.getrefcount(list1))
144 4 2
tuple(元组)
元组是只读元组比列表占用更少的空间
import sys my_list = [0] * 60 my_tuple = tuple(my_list) print(sys.getsizeof(my_list)) print(sys.getsizeof(my_tuple))
544 528
#定义元组 tuple = (1,2,3)
集合
#定义集合 set1 = {1, 2, 2, 3} #不能有重复的元素 print(set1) #添加 set1.add(4) set1.add(5) print(set1) set2 = {1, 3, 5, 7, 9} print(set2) #交集 #set3 = set1 & set2 等同于下面的方法 set3 = set1.intersection(set2) print(set3) #并集 '''set4 = set1 | set2 等同于下面的方法 ''' set4 = set1.union(set2) print(set4) #叉集 set5 = set1 - set2 set5 = set1.difference(set2) print(set5) #对称差 set6 = set1 ^ set2 set6 = set1.symmetric_difference(set2) print(set6) #set2是否是set1的子集 #set2 <= set1 print(set2.issubset(set1)) #超集 set1是否是set2的超集 print(set1.issuperset(set2))
{1, 2, 3} {1, 2, 3, 4, 5} {1, 3, 5, 7, 9} {1, 3, 5} {1, 2, 3, 4, 5, 7, 9} {2, 4} {2, 4, 7, 9} False False
#遍历 set2 = {1, 3, 5, 7, 9} for val in set2: print(val) #集合不用下标取元素,因为集合没有顺序,是离散存储 #可以用pop方法取数据,但不能确定取到哪个数据 print(set2.pop()) #删除数据 if 3 in set2: set2.remove(3) print(set3)
1 3 5 7 9 1 {1, 3, 5}
set1 = {'hello', 'good', 'banana', 'zoo', 'Python' } print(len(set1)) x = sorted(set1) #排序完变成列表 print(type(x)) print(x) list1 = list(set1) print(list1) list2 = [1, 1, 3, 1, 2, 4] set2 = set(list2) print(set2) tuple1 = (1, 1, 2, 3, 4, 4) list3 = list(tuple1) print(list3) set3 = set(tuple1) print(set3) set4 = set(range(10)) print(set4)
5 <class 'list'> ['Python', 'banana', 'good', 'hello', 'zoo'] ['Python', 'zoo', 'banana', 'good', 'hello'] {1, 2, 3, 4} [1, 1, 2, 3, 4, 4] {1, 2, 3, 4} {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
经典错误示范
def main(): names = ['关羽', '张飞', '赵云', '马超', '貂蝉'] subjects = ['语文', '数学', 'Python'] scores = [[0] * len(subjects)] * len(names) for n_index,name in enumerate(names): for s_index,subject in enumerate(subjects): scores[n_index][s_index] = int(input('请输入%s的%s成绩'%(name, subject))) print(scores) main()
请输入关羽的语文成绩99
请输入关羽的数学成绩69
请输入关羽的Python成绩39请输入张飞的语文成绩69
请输入张飞的数学成绩99
请输入张飞的Python成绩98
请输入赵云的语文成绩99
请输入赵云的数学成绩99
请输入赵云的Python成绩99
请输入马超的语文成绩98
请输入马超的数学成绩94
请输入马超的Python成绩21
请输入貂蝉的语文成绩99
请输入貂蝉的数学成绩45
请输入貂蝉的Python成绩60
[[99, 45, 60], [99, 45, 60], [99, 45, 60], [99, 45, 60], [99, 45, 60]]
names = ['关羽', '张飞', '赵云', '马超', '貂蝉'] subjects = ['语文', '数学', 'Python'] scores = [[0] * len(subjects)] * len(names) print(id(scores[0])) print(id(scores[1])) print(id(scores[2])) #可以看到通过这种方式创建的列表,只是复制了引用,会导致赋值一个动,所有的都变, #可以用下面的方式生成 scores =[[0 for _ in range(3)] for _ in range(5)] print(id(scores[0])) print(id(scores[1])) print(id(scores[2]))
82369416 82369416 82369416 122977352 122975368 82398536
def main(): names = ['关羽', '张飞', '赵云', '马超', '貂蝉'] subjects = ['语文', '数学', 'Python'] table = [] for n_index,name in enumerate(names): scores = [] for s_index,subject in enumerate(subjects): score = int(input('请输入%s的%s成绩'%(name, subject))) scores.append(score) table.append(scores) print(table) main()
请输入关羽的语文成绩99
请输入关羽的数学成绩69
请输入关羽的Python成绩59
请输入张飞的语文成绩69
请输入张飞的数学成绩99
请输入张飞的Python成绩98
请输入赵云的语文成绩99
请输入赵云的数学成绩99
请输入赵云的Python成绩99
请输入马超的语文成绩89
请输入马超的数学成绩79
请输入马超的Python成绩80
请输入貂蝉的语文成绩100
请输入貂蝉的数学成绩59
请输入貂蝉的Python成绩39[[99, 69, 59], [69, 99, 98], [99, 99, 99], [89, 79, 80], [100, 59, 39]]
""" 设计一个函数,传年,月,日,返回这一天是这一年的第几天 2018-1-1 1980-11-28 333 1981-12-31 365 2016-3-1 61 """ #笨办法,,,非常坑 def which_day(year, month, data): if (year % 400 ==0 or year % 100 != 0) and year % 4 == 0: february = 29 else: february = 28 years = [m for m in range(12)] years[0] = years[2] = years[4] = years[6] = years[7] = years[9] = years[11] =[d for d in range(31)] years[1] = [d for d in range(february)] years[3] = years[5] = years[8] = years[10] = [d for d in range(30)] days = 0 for x in range(month -1): days += len(years[x]) return days + data print(which_day(1980,11,28))
333
#高大上的办法 def is_leap_year(year): return (year % 400 == 0 or year % 100 != 0) and year % 4 == 0 def which_day(year, month, data): days_of_month = [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ][is_leap_year(year)]#布尔值在Python中True默认为1,False默认为0 total = 0 for index in range(month - 1): total += days_of_month[index] return total + data print(which_day(1980, 11, 28))
333
字典
#定义字典 {键:值} dict1 = {'name':'骆昊','age':'38','gender':True} print(dict1['name']) print(dict1['age']) print(dict1['gender']) dict1['name'] = '王大锤' print(dict1) #加数据 #dict1 += {'tel':'13511223344'}这种方式不行 dict1.update(height=174.5, fav=['吃','喝']) print(dict1) #遍历 for x in dict1: print(x, '--->',dict1[x]) #删除元素 print(dict1.pop('age'))#输入键,会删除相应的元组,返回值 print(dict1) print(dict1.popitem())#删掉最后一项 #dict1.setdefault('motto','成年人') 设置默认值,如果不知道这个值有没有,防止调用时程序崩溃,设置它 def dict['gender']#删除键所对应的值和本身 print(dict1) def dict1#删掉dict1的引用
骆昊 38 True {'name': '王大锤', 'age': '38', 'gender': True} {'name': '王大锤', 'age': '38', 'gender': True, 'height': 174.5, 'fav': ['吃', '喝']} name ---> 王大锤 age ---> 38 gender ---> True height ---> 174.5 fav ---> ['吃', '喝'] 38 {'name': '王大锤', 'gender': True, 'height': 174.5, 'fav': ['吃', '喝']}
""" 作业 杨辉三角 1 11 121 1331 14641 生成一个指定行数的杨辉三角形 函数 挑战 生成一个指定阶数的螺旋矩阵 """
def yanghui(n=1): ''' 杨辉三角形生成器 :param n: 函数 :return: 一个包含杨辉三角形的列表 ''' list1 = [[0 for _ in range(n)] for _ in range(n)] for r in range(n): for c in range(n): if c == 0 and r == 0: list1[r][c] = 1 break elif c == 0: list1[r][c] = 1 else: list1[r][c] = list1[r - 1][c] + list1[r - 1][c - 1] return list1 def yhprint(list2): ''' 杨辉三角形解释器 :param list2: 杨辉三角形生成器 :return: 杨辉三角形 ''' for row in list2: for num in row: if num != 0: print(num, end=' ') print('') yhprint(yanghui(5))
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
def factorial(n): num = n for x in range(1, n): num *= x return num def yanghui(n): for rol in range(n): for col in range(rol + 1): if col == 0 or col == rol: print(1, end=' ') else: num = factorial(rol) // (factorial(col) * factorial(rol - col)) print(num, end=' ') print() yanghui(5)
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
def my_spiral(n): list1 = [[0 for _ in range(n)] for _ in range(n)] i = 0 num = 1 x = y = 0 while num <= n ** 2: for y in range(0 + i, n - i): if num > n ** 2: break list1[x][y] = num num += 1 for x in range(1 + i , n - i): if num > n ** 2: break list1[x][y] = num num += 1 for y in range( n - i - 2,-1 + i, -1): if num > n ** 2: break list1[x][y] = num num += 1 for x in range(n - i - 2,0 + i, -1): if num > n ** 2: break list1[x][y] = num num += 1 i += 1 return list1 def spprint(list2): for roll in list2: print(roll)
相关文章推荐
- Python学习笔记二:列表、字典、元组、集合 简介
- Python 入门学习 -----变量及基础类型(元组,列表,字典,集合)
- 【python学习笔记】Python数据结构(列表,元组,字典,集合)
- Day2 Python基础学习——字符串、列表、元组、字典、集合
- python学习-1-列表,元组,字典,集合,文件操作
- Python学习笔记(9)-列表list、元组tuple、字典dict、集合set
- python学习-1-列表,元组,字典,集合,文件操作
- Python 学习笔记 -- 变量、元组、列表、字典和集合
- Python 入门学习 -----变量及基础类型(元组,列表,字典,集合)
- python 学习笔记(3)数据类型2 (元组(tuple),集合,字典)
- Python学习笔记ucas(lecture2)数据结构(字符串、列表、元组、字典、集合)
- Python学习笔记3-Python元组、数组、字典集合的操作
- python学习第二天,一些常用集合(list、元组、字典)功能和用法等
- Python学习笔记3-Python元组、数组、字典集合的操作
- (python学习笔记)1 元组、集合、字典
- Python中列表、字典、元组、集合数据结构整理
- python的列表、元组、字典、集合
- python学习(列表、字典、元组、序列)
- Python(5-6-7):数字+字符串+列表+元组+字典+集合
- python学习笔记二 列表、字典、集合