想起来自己还有个CSDN 帐号了…最近Python 写的比较多,总有些地方搞不清楚需要查,这几天开始重新过一下基础。
random 的用法
random 是python 的一个模块,用之前需要import 一下
常用方法:
random.random()
返回 [0.0, 1.0) 范围内的下一个随机浮点数。
from random import randint
# randint(a,b) 返回[a,b] 的随机数
a = randint(1,6)
print(a)
*args 和 **kwargs
*args是可变的positional arguments列表,**kwargs是可变的keyword arguments列表。两个可以同时使用,但在使用时,*args必须在 **kwargs的前面,因为positional arguments,有位置顺序的对应,必须位于keyword arguments之前
# https://blog.maxkit.com.tw/2018/12/python-args-kwargs.html
def fun(a, *args, **kwargs):
print("a={}".format(a))
for arg in args:
print('Optional argument: {}'.format( arg ) )
for k, v in kwargs.items():
print('Optional kwargs argument key: {} value {}'.format(k, v))
fun(1,22,33, k1=44, k2=55)
print("")
args = [1,2,3,4]
fun(*args)
print("")
kwargs = {'k1':10, 'k2':11}
fun(1, **kwargs)
print("")
fun(1, *args, **kwargs)
# output
a=1
Optional argument: 22
Optional argument: 33
Optional kwargs argument key: k1 value 44
Optional kwargs argument key: k2 value 55
a=1
Optional argument: 2
Optional argument: 3
Optional argument: 4
a=1
Optional kwargs argument key: k1 value 10
Optional kwargs argument key: k2 value 11
a=1
Optional argument: 1
Optional argument: 2
Optional argument: 3
Optional argument: 4
Optional kwargs argument key: k1 value 10
https://blog.maxkit.com.tw/2018/12/python-args-kwargs.html
列表
注意深浅拷贝的问题,复制一个列表,需要用切片才可以完全复制。
def main():
fruits = ['grape', 'apple', 'strawberry', 'waxberry']
fruits += ['pitaya', 'pear', 'mango']
# 循环遍历列表元素
for fruit in fruits:
print(fruit.title(), end=' ')
print()
# 列表切片
fruits2 = fruits[1:4]
print(fruits2)
# fruit3 = fruits # 没有复制列表只创建了新的引用
# 可以通过完整切片操作来复制列表
fruits3 = fruits[:]
print(fruits3)
fruits4 = fruits[-3:-1]
print(fruits4)
# 可以通过反向切片操作来获得倒转后的列表的拷贝
fruits5 = fruits[::-1]
print(fruits5)
if __name__ == '__main__':
main()
f = [x ** 2 for x in range(1, 100)]
是列表
f = (x ** 2 for x in range(1, 100))
是生成器
import sys
def main():
f = [x for x in range(1, 10)]
print(f)
f = [x + y for x in 'ABCDE' for y in '1234567']
print(f)
# 用列表的生成表达式语法创建列表容器
# 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
f = [x ** 2 for x in range(1, 100)]
print(sys.getsizeof(f)) # 查看对象占用内存的字节数
print(f)
# 请注意下面的代码创建的不是一个列表而是一个生成器对象
# 通过生成器可以获取到数据但它不占用额外的空间存储数据
# 每次需要数据的时候就通过内部的运算得到数据(需要花费额外的时间)
f = (x ** 2 for x in range(1, 1000))
print(sys.getsizeof(f)) # 相比生成式生成器不占用存储数据的空间
print(f)
for val in f:
print(val)
if __name__ == '__main__':
main()
# output
[1, 2, 3, 4, 5, 6, 7, 8, 9]
['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']
184
[1, 4, 9, 16, 25, 36, 49, 64, 81]
112
<generator object main.<locals>.<genexpr> at 0x00000220A79A6BA0>
1
4
9
16
25
36
49
64
81
元组
set 中 add 是 直接添加一个整体,update 是把添加进去的元素拆分再添加进去。
set 中discard() 方法用于移除指定的集合元素。
该方法不同于 remove() 方法,因为 remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会
myset1 = set()
myset1.add('hello')
#{'hello'}
myset1.update('world')
#{'d', 'hello', 'l', 'o', 'r', 'w'}
myset2 = set()
myset2.add('123')
myset2.update('123')
#{'1', '123', '2', '3'}
https://blog.csdn.net/weixin_42317507/article/details/91583349
def main():
set1 = {1, 2, 3, 3, 3, 2}
print(set1)
print('Length =', len(set1))
set2 = set(range(1, 10))
print(set2)
set1.add(4)
set1.add(5)
set2.update([11, 12])
print(set1)
print(set2)
set2.discard(5)
# remove的元素如果不存在会引发KeyError
if 4 in set2:
set2.remove(4)
print(set2)
# 遍历集合容器
for elem in set2:
print(elem ** 2, end=' ')
print()
# 将元组转换成集合
set3 = set((1, 2, 3, 3, 2, 1))
print(set3.pop())
print(set3)
# 集合的交集、并集、差集、对称差运算
print(set1 & set2)
# print(set1.intersection(set2))
print(set1 | set2)
# print(set1.union(set2))
print(set1 - set2)
# print(set1.difference(set2))
print(set1 ^ set2)
# print(set1.symmetric_difference(set2))
# 判断子集和超集
print(set2 <= set1)
# print(set2.issubset(set1))
print(set3 <= set1)
# print(set3.issubset(set1))
print(set1 >= set2)
# print(set1.issuperset(set2))
print(set1 >= set3)
# print(set1.issuperset(set3))
if __name__ == '__main__':
main()
# output
{1, 2, 3}
Length = 3
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
{1, 2, 3, 6, 7, 8, 9, 11, 12}
1 4 9 36 49 64 81 121 144
1
{2, 3}
{1, 2, 3}
{1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12}
{4, 5}
{4, 5, 6, 7, 8, 9, 11, 12}
False
True
False
True
练习
# 练习1 跑马灯
import os
import time
def main():
content = 'Try'
while 1:
os.system('cls') # 清空屏幕
print(content)
time.sleep(0.2)
content = content[1:] + content[0]
if __name__ == '__main__':
main()
# practice 2 设计函数返回后缀名
def main(filename, has_dot = False):
pos = filename.rfind('.')
# rfind 返回最右侧的位置,lfind 返回最左侧的同理
if 0 < pos < len(filename) - 1:
index = pos if has_dot else pos + 1
else:
return ''
if __name__ == '__main__':
main()
# 返回列表中最大的数和第二大的数
def max2(x):
# 逻辑:先默认 m1,m2 分别等于 x[0],x[1], 这是如果x[0] > x[1] 的话,否则的话 x[1],x[0]
'''
if x[0] > x[1]:
m1,m2 = (x[0],x[1])
else:
m1,m2 = (x[1],x[0])
'''
m1,m2 = (x[0],x[1]) if x[0] > x[1] else (x[1],x[0])
for index in range(2,len(x)):
if x[index] > m1:
m2 = m1
m1 = x[index]
elif x[index] > m2:
m2 = x[index]
return m1,m2
# 杨辉三角
def main():
num = int(input('Numbers of rows:'))
yh = [[]] * num
# per = [[1,[]]] * 30
print(per)
for row in range(len(yh)):
yh[row] = [None] * (row + 1)
for col in range(len(yh[row])):
if col == 0 or col == row:
yh[row][col] = 1
else:
yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
print(yh[row][col], end='\t')
print()
if __name__ == '__main__':
main()
yh = [[]] * num 结果是 [ [],[],[],......, [] ] 里面一共n个[]