"""
Author :王星喆
Data : 2018-3-7
"""
注意 由于print 和 input 这些函数只能在终端下使用,所以在函数中不要出现print和input
列表
时间和空间是不可调和的矛盾
软件和硬件在逻辑上是等效的
#定义列表
f = []
#列表内有6个0的定义
f = [0] * 6
#两个定义是一样的
f = [0, 0, 0, 0, 0, 0]
生成表达式
import sys
#创建列表的另一种方式
f = list(range(10))
print(f)
f = [x ** 2 for x in range(1, 10)]
#生成列表的表达式
print(f)
print(sys.getsizeof(f))
f = [x ** x for x in range(1, 10)]
print(f)
print(sys.getsizeof(f))
f = (x ** 2 for x in range(1, 10))
print(f)
print(sys.getsizeof(f))
#getsizeof 可以计算数据占用内存
提示 :用列表的生成表达式语法创建列表容器,用这种语法创建列表之后元素已经准备就绪所以需要耗费更多的内存空间
f = [x + y for x in 'abcde'for y in '1234567']
print(f)
['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7']
生成器
f = (x ** x for x in range(1, 10))
print(f)
#generator 生成器
#生成器和生成表达式的区别:
#生成器会占用更少的空间只有在调用时,才产生数据
for val in f:
print(val)
<generator object <genexpr> at 0x0000000005334678>
1
4
27
256
3125
46656
823543
16777216
387420489
提示 列表生成器 这里得到的不是一个列表,而是一个生成器对象
- 通过生成器可以获取到数据,它不占用额外的空间存储数据
- 每次需要数据的时候就通过生成器取数据,当然这需要花费时间
#取列表的元素
f = [12, 45, 99, 777, 32, 68]
print(f[0])
print(f[2])
f[4] = 77
print(f[4])
12
99
77
#有了列表(容器)我可以使用1个变量保存多个数据
#更为重要的是我们可以使用循环对列表中保存的数据进行操作
from random import randint
f = [0] * 6
for _ in range(60000):
f[randint(0,5)] += 1
print(f)
[10180, 10075, 10011, 9749, 10184, 9801]
#列表的长度
f = [0] * 6
print(len(f))
6
from random import randint
f = [0] * 11
for _ in range(60000):
f[randint(0,5) + randint(0,5)] += 1
for index in range(len(f)):
print('%d 点摇出了%d次'%(index + 2, f[index]))
#直接通过for-in循环对列表(容器)进行遍历
for counter in f:
print(counter)
2 点摇出了1637次
3 点摇出了3270次
4 点摇出了5081次
5 点摇出了6654次
6 点摇出了8194次
7 点摇出了9957次
8 点摇出了8432次
9 点摇出了6650次
10 点摇出了5148次
11 点摇出了3347次
12 点摇出了1630次
1637
3270
5081
6654
8194
9957
8432
6650
5148
3347
1630
from random import randint
def roll_dice(n):
total = 0
for _ in range(n):
total += randint(1, 6)
return total
print(roll_dice(2))
11
遍历
#遍历
f = [100, 200, 300]
print(f[0])
print(f[1])
print(f[2])
print(f[-1])
for index in range(len(f)):
print(f[index])
for val in f:
val += 10
print(val)
#对val赋值对f没有影响
print(f)
100
200
300
300
100
200
300
110
210
310
[100, 200, 300]
f = [100, 200, 300]
for index, val in enumerate(f):
#enumerate枚举,使f变成由下标和元素组成的元组
print(index, ':', val)
0 : 100
1 : 200
2 : 300
CRUD操作 Create Read Update Delete
f = [100, 200, 500]
#append 在列表中末尾添加新的元素
f.append(123)
print(f)
#在下标处添加一个元素,不覆盖原数据,原数据向后顺延
f.insert(1,300)
print(f)
#删除列表中下标为3的元素
del f[3]
print(f)
#remove 移除列表中的某个元素第一个匹配的结果
if 500 in f:
#可以判断一个元素是否在容器中
f.remove(500)
print(f)
#清除列表中所有的数据
f.clear()
print(f)
[100, 200, 500, 123]
[100, 300, 200, 500, 123]
[100, 300, 200, 123]
[100, 300, 200, 123]
[]
f = [100, 200, 500]
#从列表中找出某个值第一个匹配的索引值
print(f.index(500))
#pop移除列表中指定下标处的元素(默认移除最后一个元素),并返回删除的数据
print(f.pop())
print(f)
2
500
[100, 200]
"""
写一个列表,
fibonacci序列
[1, 1, 2, 3, 5, 8, 13, 21,...]
"""
list1 = [0] * 20
list1[0] = 1
list1[1] = 1
for n in range(2, 20):
list1[n] = list1[n - 1] + list1[n - 2]
print(list1)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
#列表的翻转
f = [1, 2, 3, 4]
f.reverse()
print(f)
f2 = reversed(f)
#翻转序列生成器
print(f2)
f3 = list(reversed(f))
print(f3)
[4, 3, 2, 1]
<list_reverseiterator object at 0x0000000005034240>
[1, 2, 3, 4]
#排序
f = ['orange', 'apple', 'banana', 'pitaya', 'blueberry']
f2 = sorted(f)
print(f)
print(f2)
f3 = sorted(f, reverse = True)
#Python内置的排序方法是默认都是排升序(从小到大)
#如果希望排序成降序(从大到小)可以通过reverse参数来制定
#Python中的函数几乎都是没有副作用的函数
#调用函数之后不会影响传入的参数
print(f3)
['orange', 'apple', 'banana', 'pitaya', 'blueberry']
['apple', 'banana', 'blueberry', 'orange', 'pitaya']
['pitaya', 'orange', 'blueberry', 'banana', 'apple']
f = ['orange', 'apple', 'banana', 'pitaya', 'blueberry']
f.sort()
#升序
print(f)
f.sort(reverse=True)
print(f)
['apple', 'banana', 'blueberry', 'orange', 'pitaya']
['pitaya', 'orange', 'blueberry', 'banana', 'apple']
小技巧在pycharm中Ctrl+Alt+l可以格式化代码
"""
列表容器,装的是数字,找最大,最小,平均
单词长短排序
"""
def main():
scores = [95, 78, 62, 99, 45, 32, 80]
min_score = max_score = scores[0]
total = 0
for score in scores:
if score > max_score:
max_score = score
if score < min_score:
min_score = score
total += score
print('最高分:', max_score)
print('最低分:', min_score)
print('平均分 %.1f'% (total / len(scores)))
main()
最高分: 99
最低分: 32
平均分 70.1
f = ['orange', 'apple', 'zoo', 'internationalization' , 'blueberry']
f2 = sorted(f, key=len)
#按字符串的长短排序
print(f2)
['zoo', 'apple', 'orange', 'blueberry', 'internationalization']
"""
双色球- 6个红色球(1-33)和1(1 - 16)个蓝色球,给定组数,随机生成给定组数,红色球不能重复并按大小排列
"""
# 用切片可以复制一个新的列表
def ball_game(n=1):
for _ in range(n):
red_ball = [x for x in range(1, 34)]
red_ball3 =[]
for count in range(6):
red_ball3.append(red_ball.pop(randint(0,32 - count )))
red_ball3.sort()
red_ball3.append(randint(1,16))
print(red_ball3)
ball_game(3)
[9, 14, 15, 21, 24, 25, 3]
[1, 4, 7, 19, 23, 30, 14]
[9, 10, 13, 18, 26, 33, 2]
from random import randint,randrange
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 display(balls):
for index, ball in enumerate(balls):
if index == len(balls) - 1:
print('|',end = ' ')
print('%02d'%ball,end = ' ')
print()
for _ in range(3):
display(random_select())
02 05 10 21 23 33 | 03
06 10 16 18 26 33 | 14
04 05 08 21 25 26 | 14
#身份函数
#id()函数和is运算符—验证身份
list1 = [0, 1]
list2 = list1
print(id(list1))
print(id(list2))
print(list1 is list2)
list2 = list1[:]
print(id(list1))
print(id(list2))
print(list1 is list2)
84311752
84311752
True
84311752
84523080
False
a = 100
b = 100
print(a is b)
#100事先存在于静态区,a, b 都是调用的同一个地址
#is 验证两个变量的地址是否相同
a = -6
b = -6
print(a is b)
True
False
#栈(stack)、堆(heap)、静态区
#变量 - 对象的引用 - 对象的地址 - 栈
#对象 - 堆 - 获取更大的存储空间(除了栈和静态区,物理内存越大堆越大)
"""
1.设计一个函数计算传入的成绩列表的平均分要求去掉一个最高分和一个最低分
2.7个学生的名字,录入7个成绩,并返回谁考了最高分,谁考了最低分
names = []
for name in names:
score = input('请输入%s的成绩'%name)
3.设计一个函数从传入的列表中找出第二大的元素(只能使用一次循环)
4.函数返回最大和最小两个数,用元组。
"""
def main():
grades = [65, 37, 59, 63, 75, 89, 99, 100]
max_grade = min_grade = grades[0]
total = 0
for grade in grades:
if grade > max_grade:
max_grade = grade
if grade < min_grade:
min_grade = grade
total += grade
average = (total - min_grade - max_grade) / (len(grades) - 2)
print(average)
main()
75.0
def main():
names = ['刘备', '关羽', '张飞', '马超', '赵云', '黄忠', '曹操']
grades1 = []
for name in names:
grades1.append(int(input('请输入%s的成绩'%name)))
max_grade1 = max(grades1)
min_grade1 = min(grades1)
grades2 = grades1[:]
while True:
max_index = grades2.index(max_grade1)
print('%s的成绩最高是%d'%(names[max_index],max_grade1))
grades2[max_index] = 0
if max_grade1 not in grades2 :
break
while True:
min_index = grades2.index(min_grade1)
print('%s的成绩最低是%d'%(names[min_index],min_grade1))
grades2[min_index] = 0
if min_grade1 not in grades2:
break
main()
请输入刘备的成绩99
请输入关羽的成绩89
请输入张飞的成绩69
请输入马超的成绩69
请输入赵云的成绩99
请输入黄忠的成绩89
请输入曹操的成绩97
刘备的成绩最高是99
赵云的成绩最高是99
张飞的成绩最低是69
马超的成绩最低是69
def second_count(list1):
"""
返回列表中第二大的数
:param list1: 一个全是数字的列表
:return: 列表中第二大的数
"""
max1 = max2 = 0
for count in list1:
if max1 < count:
max1 = count
elif max2 < count < max1:
max2 = count
return max2
print(second_count([9, 8, 9, 7, 6, 9, 4, 4, 3, 2, 1]))
8