Python——元组、集合、字典

"""
约瑟夫环
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':'e','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的引用

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值