列表基础
前提概念
- 容器 - 一个容器型数据可以同时保存多个其他的数据;
- 元素 - 容器中每一个独立的数据;
列表 - List
- 列表时容器型数据类型(序列),[]作为容器的标志,里面的多个元素用逗号隔开;
- 表示方式:[元素1,元素2,…,元素n]
列表的特点
- 列表是可变的(元素的个数,值和顺序可变) - 增、删、改、查;
- **列表是有序的 **- 支持下标操作;
- 列表对元素没有要求,什么类型的数据都可以作为列表的元素;
列表类型
-
空列表 - list = []
-
列表 - 可以同时保存类型不同的数据
list3 = ['God', 777, 66.66, [], (2,), None, False]
查看类型
print(type(list1), type(list2)) # <class 'list'> <class 'list'>
查看是否为空值
- 布尔值判断与元素个数判断
print(bool(list1), bool(list2)) # False False
print(len(list1), len(list2)) # 0 0
列表的查询
- 列表的查询目的就是为了获取列表内的元素;
- 获取元素的方式 - 获取单个元素、切片、遍历(一个一个的取);
获取单个元素
语法
列表[下标]
功能
- 获取列表中指定下标对应的元素
说明
- 列表 - 任何结果是列表的表达式(保存列表的变量,具体的列表值);
- [] - 固定写法;
- 下标 - 下标又叫索引,列表中元素在有序序列中的位置信息;
- Python中有序序列中的每个元素都有两组下标值;从前往后正索引(0n),从后往前**负索引**(-1-(n+1));注意:下标不能越界
names = ['甄姬', '貂蝉', '韩信', '吕布', '赵云', '后羿', '鲁班', '狄仁杰']
print(names[1])
遍历
遍历方法
-
直接获取列表中的每一个元素;
for 变量 in 列表: 循环体
names = ['甄姬', '貂蝉', '韩信', '吕布', '赵云', '后羿', '鲁班', '狄仁杰'] for i in names: print(i)
-
先获取到每个元素的下标值,然后通过下标再获取元素;
for 下标 in range(len(列表)): 循环体
names = ['甄姬', '貂蝉', '韩信', '吕布', '赵云', '后羿', '鲁班', '狄仁杰'] for index in range(len(names)): print(index, names[index])
-
同时获取列表中每个元素和元素对应的下标;
for 下标, 元素 in enumerate(列表): 循环体
names = ['甄姬', '貂蝉', '韩信', '吕布', '赵云', '后羿', '鲁班', '狄仁杰'] for index, item in enumerate(names): print(index, item)
练习
-
统计不及格人数
scores = [89, 67, 56, 90, 98, 30, 78, 51, 99] fail_count = 0 for i in scores: if i < 60: fail_count += 1 print('不及格人数为:', fail_count)
-
统计列表中整数的个数
list7 = [89, 9.9, 'abc', True, 'abc', '10', 81, 90, 23] num = 0 for i in list7: if isinstance(i, int): # if type(i) == int: print(i) num += 1 print('整数的个数为:', num)
-
求nums中所有偶数的和
nums = [89, 67, 56, 90, 98, 30, 78, 51, 99] sum1 = 0 for i in nums: if i % 2 == 0: sum1 += i print('偶数的和为:', sum1)
列表添加元素
添加单个元素
语法
-
列表.append(元素) - 列表的最后添加一个指定元素;
-
**列表.insert(下标,元素) ** - 在指定的下标的对应元素前插入指定元素;
movies = ['五十度灰', '环大西洋', '富春山居图'] print(movies) movies.append('金刚川') print(movies) movies.insert(2, '沉默的羔羊') print(movies)
批量添加
语法
-
列表1.extend(列表2) - 将列表2里面的元素全部添加到列表1的尾部;
movies.extend(['让子弹飞', '触不可及', '这个杀手不太冷']) print(movies)
练习
-
将列表中所有及格的分数提取出来
scores = [89, 67, 56, 90, 98, 30, 78, 51, 99] pass_scores = [] for i in scores: if i >= 60: pass_scores.append(i) print(pass_scores)
周末练习题
基础题
第一周作业
一、选择题
-
下列变量名中不合法的是?(C)
A. abc
B. Npc
C. 1name
D ab_cd
-
下列选项中不属于关键字的是?(B)
A. and
B. print
C. True
D. in
-
下面哪个选项对应的代码写法是正确的?(C)
A.
print('Python') print('新手村')
B.
print('Python') print('新手村')
C.
print('Python') print('新手村')
D.
print('Python''新手村')
-
下面选项中能打印出50的是?B
A.
print('100 - 50')
B.
print(100 - 50)
-
关于引号,下面选项中使用正确的是?D
A.
print('hello)
B.
print("hello')
C.
print(“hello”)
D.
print("hello")
二、编程题
-
写代码在控制台打印
good good study, day day up!
print('good good study, day day up!')
-
写代码在控制台打印5次
you see see, one day day!
for _ in range(5): print('you see see, one day day!')
-
写代码打印数字 11、12、13、… 21
num = 10 while True: num += 1 print(num, end=' ') if num == 21: break
-
写代码打印数字 11,13,15,17,…99
for i in range(11, 100, 2): print(i, end=' ')
-
写代码打印数字:10、9、8、7、6、5
for i in range(10, 4, -1): print(i, end=' ')
-
写代码计算:1+2+3+4+…+20 的和
num = 0 for i in range(20): num += i print(num)
-
写代码计算100以内所有偶数的和
num = 0 for i in range(0, 100, 2): num += i print(num)
-
写代码统计100~200中个位数是3的数的个数
for i in range(103, 200, 10): print(i, end=' ')
-
写代码计算
2*3*4*5*...*9
的结果num = 1 for i in range(2, 10): num *= i print(num)
-
输入一个数,如果输入的数是偶数就打印
偶数
否则打印奇数
num = int(input('请输入一个数:')) if num % 2 == 0: print('这个数是偶数') else: print('这个数是奇数')
-
统计1000以内能被3整除但是不能被5整除的数的个数。
count = 0 for i in range(3, 1000, 3): if i % 5 != 0: count += 1 print(count)
进阶题
-
判断101-200之间有多少个素数,并输出所有素数。
prime_num = [] for i in range(101, 200): for j in range(2, i + 1): if i % j == 0: if i == j: prime_num.append(i) else: break print(len(prime_num), prime_num) # 结果 21 [101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
-
求整数1~100的累加值,但要求跳过所有个位为3的数。
sum1 = 0 for i in range(1, 101): if i % 10 != 3: sum1 += i print(sum1) # 结果 # 4570
-
有⼀分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的第20个分数
# 审题可知 分母为从第二项开始的裴波纳契数列,分子为第三项开始的裴波纳契数列 n1, n2 = 1, 1 n = 20 Denominator = 0 molecular = 0 for i in range(3, n + 3): n1, n2 = n2, (n2 + n1) if i == n - 1: Denominator = n2 if i == n: molecular = n2 print('第20个分数:', molecular, '/', Denominator) # 结果 # 第20个分数: 6765 / 4181
-
写程序计算 n 的阶乘 n! 的结果
num = int(input('请输入数字:')) factorial = 1 for i in range(1, num + 1): factorial *= i print(num, '的阶乘 n! 的结果:', factorial)
-
求1+2!+3!+…+20!的和
num = 20 factorial_sum = 0 factorial = 1 for j in range(1, num + 1): # 计算每项的乘积 for i in range(1, j + 1): factorial *= i # 计算所有项的乘积 factorial_sum += factorial factorial = 1 print('1+2!+3!+...+20!的和为:', factorial_sum) # 结果 # 1+2!+3!+...+20!的和为: 2561327494111820313
-
写程序求表达式 a + aa + aaa + aaaa+ … 的结果,其中a是1~9的数字,求和的项数用n来控制。(a和n可以用变量来表示)
例如:a为3, n为5的时候: 3 + 33 + 333 + 3333 + 33333
a = 3 n = 5 num, num1 = 0, 0 for i in range(0, n): # 计算每项的数 num += a * 10 ** i # 项数求和 num1 += num print(num1) # 结果 # 370368
-
控制台输出三角形
a.根据n的值的不同,输出相应的形状 n = 5时 n = 4 ***** **** **** *** *** ** ** * * b.根据n的值的不同,输出相应的形状(n为奇数) n = 5 n = 7 * * *** *** ***** ***** ******* c. 根据n的值的不同,输出相应的形状 n = 4 1 121 12321 1234321 n = 5 1 121 12321 1234321 123454321
# a n = 4 for i in range(5,0,-1): print('*'*i) # b n = 7 for i in range(1, n + 1): if i % 2 != 0: print(' ' * (n - i), ' *' * i) # c # 每行为 行数个1的平方 n = 5 num = 1 num1 = 0 for i in range(n): num *= num * 10 ** i num1 += num num = 1 print(' ' * (n - i), num1 ** 2)
-
小明单位发了100元的购物卡,小明到超市买三类洗化用品,洗发水(15元),香皂(2元),牙刷(5元)。要把100元正好花掉,可有哪些购买结合?
for shampoo in range(0, 7): for soap in range(0, 50): for toothbrush in range(0, 21): if shampoo * 15 + soap * 2 + toothbrush * 5 == 100: print('洗发水:', shampoo, '香皂:', soap, '牙刷:', toothbrush)
-
一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?
count = 0 paper_thickness = 0.08 Everest_height = 884813 while True: count += 1 # 统计对折次数 paper_thickness *= 2 # 计算每次对折后的厚度 if paper_thickness >= Everest_height: break print('对折:', count, '次') # 结果 # 对折: 24 次
-
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
# 通过前几个月兔子对数的罗列可以得知是一个求裴波纳契数列指定项的题 month_n = 7 m1, m2 = 1, 1 for i in range(2, month_n): m1, m2 = m2, m1 + m2 print('第', month_n, '月有', m2 * 2, '只兔子') # 结果 # 第 7 月有 26 只兔子
-
将一个正整数分解质因数。例如:输入90,打印出90=2x3x3x5。
num = 987654321 lst1 = [] print(num, '= ', end='') for i in range(2, int(num**0.5) + 1): # 设定遍历大于2小于该数开更号的所有数 if num % i == 0: # 如果用遍历到的数对该数取余为0就表明这是质因数 # 将所有为i的质因数通过循环全取出,再寻找下一个质因数 while True: num /= i lst1.append(i) if num % i != 0: break # 如果最后剩下的数不等于1且不能被该数开更号后的任意数整除,这个数就是该数的最大质因数 if num != 1: lst1.append(int(num)) # 对存储质因数的列表进行控制格式打印 for i in range(len(lst1)): if i == len(lst1) - 1: print(lst1[i], end='') else: print(lst1[i], 'x ', end='') # 结果 # 987654321 = 3 x 3 x 17 x 17 x 379721
-
某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。求输入的四位整数加密后的值
num = 5678 a, b = 0, 0 for i in range(len(str(num))): # 根据数字长度设定循环次数 a = num % 10 # 得到低位数 num //= 10 # 将高位数降位 b = (a + 5) % 10 # 按照题干要求进行计算 print(b, end='') # 结果 # 3210
-
本金10000元存入银行,年利率是千分之三。每过1年,将本金和利息相加作为新的本金。计算5年后,获得的本金是多少。
year = 5 principal = 10000 APR = 3/1000 for i in range(year): # 按年循环 # 前一年的本金加利息等于后一年的本金 principal = principal + principal*APR print(principal) # 结果 # 10150.90270405243
-
输入一个整数,计算它各位上数字的和。(注意:输入的整数可以是任意位)
num = int(input('请输入数字:')) sum1, tmp = 0, 0 for i in str(num): # 数字有多少位就循环多少次 tmp = num % 10 # 取该数字个位的数 num //= 10 # 将数字的个位抹除 sum1 += tmp # 依次将每次循环的个位相加 print('各位上数字的和:', sum1) num = int(input('请输入数字:')) sum1 = 0 for i in str(num): # 将数字作为字符串一个一个取数 sum1 += int(i) # 直接将每一位数字相加 print('各位上数字的和:', sum1)
-
求两个数的最大公约数和最小公倍数。(提示:公约数一定小于等于两数中的小的那个数,且能同时被两个数整除;公倍数一定大于等于两数中的大数,且是大数的倍数又能被两数中的小数整除)
num1, num2 = 27, 48 # num1 = int(input('请输入第一个数:')) # num2 = int(input('请输入第二个数:')) GCD, LCM = 0, 0 for i in range(1, min(num1, num2) + 1): # 如果两数能被同一个数整除,这个数小于较小的那个数 if num1 % i == 0 and num2 % i == 0: GCD = i # 两数相乘后除以他们的公约数就是最小公倍数 LCM = int(num1 * num2 / GCD) print('最大公约数为:', GCD, '|最小公倍数为:', LCM) # 结果 # 最大公约数为: 3 |最小公倍数为: 432