python小众习题详解之三

时间和空间是不可调和的矛盾

软件和硬件在逻辑上是等效的

有了列表(容器)我们可以使用1个变量来保存多个数据

更为重要的是我们可以使用循环对列表中保存的数据进行操作

例1:摇两个色子各点数出现的概率
from random import  randint
def roll_dice(n=2):
    total = 0
    for _ in range(n):
        total += randint(1,6)
    return total
def main():
    f = [0] * 11
    for _ in range(60000):
        face = roll_dice()
        f[face - 2] += 1
    for index, val in enumerate(f):
        print('%d点摇出的概率为%.2f%%.'%(index + 2,val / 600))
    point = 2
    # 直接通过for - in 循环对列表(容器)进行遍历
    for counter in f:
        point += 1
        print('%d点摇出了%d次.'%(point - 1,counter))


if __name__ == '__main__':
    main()
列表的各项应用
def main():
    g = [100,200,300]
    for index, val in enumerate(g): #enumerate 既有下标也有值
        print(index, ':', val)
    # CRUD操作:Create Read Update Delete
    g.append(123)               #追加,加到最后
    g.insert(1,400)             #插入,可以指定插入位置,在指定下标的前一位置插入
    g.insert(-1,500)
    g.remove(200)               #如果不知道位置,只知道元素,就用remove删除
    if 600 in g:
        g.remove(600)
    del g[3]                    #如果知道位置,就用del删除
    print(g.index(300))         #查找元素index
    print(g)
    print(g.pop())              #默认删除最后一个参数(可删除指定下标的元素)
    print(g)
    g.clear()                   #清空
    print(g)

if __name__ == '__main__':
    main()
例2:“黄金比例”
def main():
    list = [1, 1]
    for index in range(2,20):
        val = list[index - 1] + list[index - 2]
        list.append(val)
    print(list)
    print(list[18]/list[19])
    list1 = list[18:]
    list2 = list[::-1]
    print(list2)
    list.reverse()
    print(list)
if __name__ == '__main__':
    main()

排序

def main():
    l = ['orange','apple','pit','banana','blueberry']
    # Python内置的排序方法默认都是升序(从小到大)
    # 如果希望排列成降序(从大到小)可以通过reverse参数来指定
    # Python中的函数几乎都是没有副作用的函数
    # 调用函数之后,不会影响传入的函数
    l2 = sorted(l)    # sorted 会新增从小到大一个排好序的结果
    l3 = sorted(l,reverse=True)
    print(l)
    print(l2)
    print(l3)
    l.sort()          #方法,在原列表进行排序
    print(l)
    l.sort(reverse=True)
    print(l)
    l4 = list(reversed(l))
    print(l4)
if __name__ == '__main__':
    main()

列表的生成方法

def main():
    f = [x + y for x in 'ABCDE' for y in '1234567']
    print(f)
    f = list(range(1,10))
    print(f)
    f = [x for x in range(1,10)]
    print(f)
    f = [x ** 2 for x in range(1,10)]
    print(f)
    f = [x ** x for x in range(1,100)]
    # 用列表的生成表达式语法创建列表容器
    # 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
    print(sys.getsizeof(f))    #   占用多少内存空间
    print(f)
    f = (x ** x for x in range(1, 100))# 生成器
    # 列表生成器 这里得到的不是一个列表 而是一个生成器对象
    # 通过生成器可以获得数据 它不占用额外的 空间存储数据
    # 每次需要数据的时候就通过生成器取数据 当然这需要花时间
    print(sys.getsizeof(f))
    print(f)
    for val in f:
        print(val)


if __name__ == '__main__':
    main()
例4:著名双色球~随机生成~
def display(balls):
    for index,ball in enumerate(balls):
        if index == len(balls) - 1:
            print('|',end=' ')
        print('%02d'%ball,end = ' ')
    print()

def random_select():
    red_balls = list(range(1,34))
    selected_balls = []
    for _ in range(6):
        index = randrange(len(red_balls))
        selected_balls.append((red_balls[index]))
        del red_balls[index]
    selected_balls.sort()
    selected_balls.append(randint(1,16))
    return selected_balls

def main():
    n = int(input('机选几注:'))
    for _ in  range(n):
        display(random_select())


if __name__ == '__main__':
    main()

栈(stack) 堆(heop) 静态区

变量 - 是对对象的引用 -其实变量里面放的是对象的地址- 在栈上

对象 - 在堆上- 为了获取更大的存储空间

id()函数和is运算符 - 验证身份

def main():
    a = 1
    b = 1
    print(id(a))   # 验地址
    print(id(b))
    c = -1
    d = -1
    print(a is b)   # 身份运算符 is
    print(c is d)
    list = [x for x in range(1,10)]
    list2 = list
    print(id(list))
    print(id(list2))
    print(list is list2)
    list2 = list[:]   # 此时切片 - 产生一个新的列表
    print(id(list))
    print(id(list2))
    print(list is list2)
    list[1] = 2000
    list2[0] =1000
    print(list)
    print(list2)
if __name__ == '__main__':
    main()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值