您的位置:首页 > 编程语言 > Python开发

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: