python基础

1.1 print() 输出函数

 

# 输出数字
print(520)
print(98.5)

# 输出字符串
print('helloworld')

# 含有运算符的表达式
print(3 + 5 + 4)

# 输出到文件  #注意 1指定盘存在 2使用file=fp 不然写不进去
fp = open('D:/text.txt', 'a+')  # a+ 文件不存在就创建 ,存在就追加
print('helloworld', file=fp)
fp.close()

# 不进行换行输出
print('hello', 'word')

1.2 转义字符

# 转义字符
print('hello\nhello')
print('hello\thello')
print('helloooo\thello')  # 此处\t空格会多
print('world\rhello')  # 只输出hello
print('hello\bworld')  # 退一个格 o没了
print('http:\\\\www.baidu.com')  # \转义加
print('大家好:\'早上好\'')

# 原字符 不希望转义字符起作用 在字符串之前加上r或R
print(r'hello\nword')  # 注意最后一个字符不能是\ 可以\\

 

1.3 保留字

 

 

 1.4 格式问题

if True:
    print('true')
else:
    print('false')

上面的为正确,而下面的为错误,python格式严格

if True:
    print('true')
else:
print('false')

 报错 IndentationError: expected an indented block 

 建议你在每个缩进层次使用 单个制表符 或 两个空格 或 四个空格 , 切记不能混用

 

1.5 多行注释

 python 中多行注释使用三个单引号(''')或三个双引号(""")

'''
这里是多行注释
'''
"""
这里也是多行注释
"""

 

1.6  同一行显示多条语句

 Python可以在同一行中使用多条语句,语句之间使用分号(;)分割

print('第一条语句') ;print('第二条语句 要使用;分号断开')

 

1.7  不换行输出  

# 换行输出
print(x)
print(y)
# 不换行输出
print(x, end=""), print(y)

 

2.1 赋值

name = 'coline'  #name里存的是id 指向coline
print('', name)
print('类型', type(name))
print('标识', id(name))  # 内存地址

 

2.2 数据类型

# 进制 可以为二进制,十进制,八进制,十六进制 默认十进制
print('十进制', 118)
print('二进制', 0b1010101)
print('八进制', 0o45712)
print('十六进制', 0x152A1)

  浮点类型

# 浮点类型
a = 3.1415
print(a, type(a))
n1 = 1.1
n2 = 2.2
print(n1+n2)  # 结果 3.3000000000000003 有误差  不一定所以都会出现
# 解决方法 导入模块
from decimal import  Decimal
print(Decimal('1.1')+Decimal('2.2'))  # 结果 3.3

  布尔类型

# 布尔bool 可以直接和整数相加
print(True+1)  # 2
print(False+1)  # 1

  字符串类型

# 字符串类型  统称字符串
str1 = '单引号'
str2 = "单引号"
str3 = """单引号
          可以多行写"""  # 会按照原样输出
print(str1, type(str1))
print(str2, type(str2))
print(str3, type(str3))

 字符串截取

str = 'new.txt'
index = str.rfind('.')  # 3  查询.所在下标
# 字符串[起始下标(默认为0):结束下标(不包括):步长(默认为1)]
print(str[:2])  # ne 
print(str[:index])  # new

字符串修改大小写

name = 'li lang'
# title()以首字母大写的方式显示每个单词
# 你可能希望程序将值Ada、ADA和ada视为同一个名字,
# 并将它们都显示为Ada
print(name.title())  # Li Lang
print(name.upper())  # LI LANG
print(name.lower())  # li lang

字符串合并

# 合并字符串使用+号
first_name = "ada"
last_name = "lovelace"
full_name = first_name + " " + last_name
print(full_name)
print("Hello, " + full_name.title() + "!")  # Hello, Ada Lovelace!

字符串去空白

# 去重字符串末尾空白rstrip()
# 去除开头空白lstrip
# 出去两边空白strip
favorite_language = 'python '
print(favorite_language)
# 去除后需要返回变量中
favorite_language = favorite_language.rstrip()
print(favorite_language)

 

2.3 类型转换

a = 10
b = 198.2
c = False
d = '123'
print(type(a), type(b), type(c), type(d))
print(str(a), str(b), str(c), str(d))  # 转成字符串
print(int(b), int(d), int(c))  # 转成整形 float-int 会有数据精度丢失
print(float(a), float(c), float(d))  # 转成float 会自己补足精度
print(bool(a), bool(d), bool(b))  # 整形大于1 为 true 字符串为true 除了 ‘True’ 和'flase'

 2.4  中文编码声明

# coding:gbk # 修改编码集

 

3.1 input函数

# 输入函数
present = input('你要什么礼物')
print(present, type(present))  # 输入的类型为字符串 需要转换采用类型转换
# 输入函数
present = int(input('你要什么礼物')) # 修改类型
print(present, type(present))

 

3.2  算数运算符

print(1+1)   # 2
print(1-1)   # 0
print(1*3)   # 3
print(1/3)   # 0.333333333
print(1%3)   # 1
print(2**3)  # 8 2的3次方
# 整除
print(9//4)    # 2
print(-9//-4)  # 2
print(9//-4)   # -3  一正一负 向下取整
print(-9//4)   # -3
# %- 公式 余数=被除数-除数*商
print(9%-4)  # -3    9-(-4)*(-3) 9-12 -3
print(-9%4)  # 3   -9-4*(-3)     -9+12  3

3.3 赋值运算符

# 链式赋值
a = b = c = 20  # 内存地址相同 20值的id都一样 都指向同一份地址
print(a, id(a))
print(b, id(b))
print(c, id(c))
# 参数赋值
a = 30
a += 20
print(a)
a *= 10
print(a)
a /= 2
print(a, type(a))  # float
a -= 10
print(a)  # 240.0
a //= 3
print(a)  # 80.0
a %= 3
print(a)  # 2.0

# 解包赋值
a, b, c = 20, 30, 40
print(a, b, c)

# 交换两个变量的值
a, b = 20, 30
print('交换前', a, b)
a, b = b, a
print('交换后', a, b)  # 交换后 30 20

 

3.4 比较运算符

大于 小于 等于 == !=

== 比较的是value值

而比较对象的标识 :is,  is not

a,b=10,10
print(a==b) # 说明a与b的value值相等
print(a is b) # 说明a于b的id相等

 

3.5 布尔运算符

#布尔运算符
a,b=1,2
#and类似于 &&
print(a==1 and b==2) # true 
print(a==1 and b<2) #false 
#or类似于||
print(a==1 or b==2) #true
print(a==1 or b!=2) #true
print(a!=1 or b>2) #false
#not类似取反
f=True
print(not f) #false
#in 在不在里面 not in 不在
s='hello'
print('o' in s) #true o字符在不在s里面
print('o' not in s)#false o字符在s里面 

 

3.6 位运算符 

#位运算符 先将数据转为2进制 在进行运算
#& 按位与
print(4&8) #0
#|按位或
print(4|8) #12
#<<左移位 左移动几位 相当于2的多少次放
print(4<<2)#16
#>>右移位 相当于除以2的多少次方
print(4>>2) #1

 

3.7 运算符优先级

 

3.8  程序的组织结构

 

 

# 以下bool值为false
# 测试对象的bool值
print(bool(False))  # False
print(bool(0))  # False
print(bool(0.0))  # False
print(bool(None))  # False
print(bool(''))  # False
print(bool(""))  # False
print(bool([]))  # False  空列表
print(bool(list()))  # False  空列表
print(bool(()))  # 空元组  False
print(bool(tuple()))  # 空元组  False
print(bool({}))    # 空字典  False
print(bool(dict()))  # 空字典  False
print(bool(set()))   # 空集合 False 

  选择分支

# 选择结构
# 单分支 if
# 多分支 if else
money = 1000  # 余额
s = int(input('请输入取款金额'))
# 判断余额是否充足
if s <= money:
    money -= s
    print('剩余余额', money)
else:
    print('余额不足')
# 多分支 if elif elif
score = int(input('输入成绩'))
if 90 <= score <= 100:
    print('A')
elif 80 <= score <= 89:
    print('B')
elif 70 <= score <= 79:
    print('C')
elif 0 < score <= 69:
    print('D')
else:
    print('输入有误')

 

 条件表达式

# 条件表达式
# 判断两个数的大小
num1 = int(input('请输入第一个数'))
num2 = int(input('请输入第二个数'))
# 格式 True if 判断 else False
print('最大的数为', num1 if num1 > num2 else num2)

3.9 pass语句

# pass语句 什么都不做,只是一个占位符,用到需要写语句的地方
# 占一个语句的位置 不会报错 适用于没有想好怎么写语句
answer = int(input('您是会员吗?y/n'))
# 判断是不是会员
if answer == 'y':
    pass
else:
    pass

3.11 range()函数

# range()的三种创建方式
# 第一种
r = range(10)  # 默认从0开始 默认步长为1
print(r)  # range(0, 10)
print(list(r))  # 用于查看range对象中的整数序列 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 第二种 (start,stop)
r = range(1, 10)  # 指定从1开始10结束不包含10
print(list(r))  # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 第三种 (start,stop,step)
r = range(1, 10, 2)  # 从1开始 到10结束不包含10 步长为2
print(list(r))  # [1, 3, 5, 7, 9]
# 判断指定整数是否在序列r中存在 使用in 或者 not in
print(10 in r)  # False
print(9 in r)  # True
print(10 not in r)  # True
# 只有当使用到的时候才会创建 一般用于for循环

3.12 循环结构

while True:
    pass  # 语句
    pass
    pass
# 计算1到100的偶数和
i = 1
num = 0
while i <= 100:
    if not(i % 2):
        num += i
    i += 1    # 此处不能使用i++ python 不支持 i++这个语法 要想累加的话 就用 i += 1这样的语句来完成
print(num)

 使用标志

# 标志
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
active = True
while active:
    message = input(prompt)
if message == 'quit':
    active = False
else:
print(message)

 

for 循环

# for
for item in 'python':
    print(item)  # 一次把python中每一次字符赋给item 然后打印
# ranger() 产生一个整数序列 也可以是一个迭代对象
for i in range(10):
    print(i)  # 0-9 执行10次
# 如果在循环中不需要使用自定义变量,可以用_代替 专注于循环次数
for _ in range(10):
    print('人生苦短')  # 打印10次人生苦短
# 计算1-100的偶数和
for i in range(1, 101):
    if not(i % 2):
        num += i
print(num)

 判断水仙数

# 输出100到999之间的水仙花数
"""
水仙花数:153=3*3*3+5*5*5+1*1*1
"""
for i in range(100, 1000):
    if int(i / 100)**3+int(i % 100 / 10)**3+(i % 100 % 10)**3 == i:
        print(i, '是水仙花数')
# 个位 i%10
# 十位 i//10%10
# 百位 i//100

 

break 语句

 

# break语句 结束循环
# 从键盘输入密码 最多三次 输入正确就结束
# 初始密码为 888
for _ in range(3):
    pwd = int(input('输入密码'))
    if pwd == 888:
        print('输入正确')
        break
    else:
        print('输入有误')

 

continue

# 输出1-50所有5的倍数
for i in range(1, 51):
    if not(i % 5):
        print(i)
# 输出不是5的倍数
for i in range(1, 51):
    if not(i % 5):
        continue
    print(i)

3.13 else 语句

# else+for
for _ in range(3):
    pwd = input("输入密码")
    if pwd == '666':
        print('密码正确')
        break
    else:
        print('密码错误')
else:
    print("三次密码均输入错误")

# else + while
a = 0
while a < 3:
    pwd = input("输入密码")
    if pwd == '666':
        print('密码正确')
        break
    else:
        print('密码错误')
        a += 1
else:
    print("三次密码均输入错误")

3.14 嵌套循环

# 打印直角三角形5行 #*
# **
# ***
# ****
# *****
for i in range(6):
    for j in range(i):
        print('*', end='')
    print()
# 打印乘法表
for i in range(1, 10):
    for j in range(1, i+1):
        print(i, '*', j, '=', i*j, '\t', end='')
    print()

 

 4.1 列表

 

 

# 切片操作
lst = [10, 20, 30, 40, 80, 10, 5, 3]
# start=1,stop=6,step=1  默认步长为1
print(lst[1:6:1])  # [20, 30, 40, 80, 10] 源列表的子集 新列表对象(通过拷贝源列表# )
print(lst[1:6:2])  # [20, 40, 10]
print(lst[:6:2])  # [10, 30, 80] start默认为0
print(lst[1::1])  # [20, 30, 40, 80, 10, 5, 3]  stop默认到最后

# 步长为负数  步长为负数类型逆序
print(lst[::-1])  # [3, 5, 10, 80, 40, 30, 20, 10] 逆序输出
print(lst[7::-1])  # [3, 5, 10, 80, 40, 30, 20, 10]
print(lst[6:0:-2])  # [5, 80, 30]

# 判断一个对象是否在列表中
print(10 in lst)  # True
print(10 not in lst)  # False

 

 

 

 

 

bicycles = ['trek', 'cannondale', 'redline', 'specialized']
# 。这种语法很有用,因为你经常需要在不知道列表长度的情况
# 下访问最后的元素。这种约定也适用于其他负数索引,例如,索引-2返回倒数第二个列表元素,
# 索引-3返回倒数第三个列表元素,以此类推
print(bicycles[-1]) # specialized
# 遍历列表
for item in lst:
    print(item, end='')

# 列表元素的增删改
# 向列表末尾增加一个元素
lst.append(100)  # 还是在原来的列表中加入 id不会变
# 添加另一个列表
lst2 = ['hello', 'world']
lst.append(lst2)  # 将lst2作为一个元素添加到列表尾部
print(lst)  # [10, 20, 30, 40, 80, 10, 5, 3, 100, ['hello', 'world']]
lst.extend(lst2)  # 将列表的元素添加到另一个列表中
print(lst)  # [10, 20, 30, 40, 80, 10, 5, 3, 100, 'hello', 'world']
# 在任意位置上添加元素
lst.insert(1, 90)  # 在索引为1的位置添加90
print(lst)

lst3 = [True, False, 'hello']
# 在任意位置上添加n多个元素
lst[1:] = lst3   # 索引为1后全覆盖
print(lst)  # [10, True, False, 'hello']

Python中append和extend的区别

 

 

 

# 嵌套列表的append和extend
number = ['1', '2', '3', '4', '5', '6', '7', '8']
str1 = [[], [], []]
str1[1].extend(number)   # [[], ['1', '2', '3', '4', '5', '6', '7', '8'], []]
# str1[1].append(number)  # [[], [['1', '2', '3', '4', '5', '6', '7', '8']], []]
print(str1)

 

 

 如果你要从列表 中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续 使用它,就使用方法pop()。

lst = [10, 20, 3, 45, 45, 41, 521]
# 根据值删除元素 有时候,你不知道要从列表中删除的值所处的位置。如果你只知道要删除的元素的值,可使 用方法remove()。
lst.remove(20)  # 如果有重复元素直移除第一个
print(lst)  # [10, 3, 45, 45, 41, 521]
# pop 根据索引移除元素  # 方法pop()可删除列表末尾的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类 比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。
lst.pop(1)  # 移除索引为1
print(lst)  # [10, 45, 45, 41, 521]
lst.pop()  # 如果不指定参数 默认最后一个元素
print(lst)  # [10, 45, 45, 41]

# 切片删除 删除至少一个元素 ,将产生一个新的列表对象
new_list = lst[1:3]
print('源列表', lst)
print('切片后的列表', new_list)  # 切片后的列表 [45, 45]
# 不产生新的列表对象,而是删除原列表中的内容
lst[1:3] = []  # 只是用空列表进行覆盖
print(lst)  # [10, 41]

# 清空列表
lst.clear()
print(lst)  # []
# 删除列表
del lst
# del 删除必须知道索引
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[1]
print(motorcycles)  # ['honda', 'suzuki']

 

lst = [10, 20, 30, 50]
# 一次修改一个值
lst[2] = 100  # 改变
print(lst)  # [10, 20, 100, 50]
lst[1:3] = [300, 400, 500]  # [10, 20, 100, 50]
print(lst)  # [10, 300, 400, 500, 50]

   逆序输出

# 逆序 reverse()
list1 = [1, 3, 2, 5, 4]
list1.reverse()
print(list1)  # [4, 5, 2, 3, 1]
# 法二
print(list1[::-1])  # [4, 5, 2, 3, 1]

   永久性排序

# sort() 排序:升序降序   字母就是按照字母顺序
list1.sort()  # 默认升序[1, 2, 3, 4, 5]  参数reverse=true 为降序  
print(list1)
list1.sort(reverse=True)
print(list1)   # [5, 4, 3, 2, 1] 降序
临时排序
# sorted()对列表进行临时排序
cars = ['bmw', 'audi', 'toyota', 'subaru']
print("Here is the original list:")
print(cars) # ['bmw', 'audi', 'toyota', 'subaru']
print("\nHere is the sorted list:")
print(sorted(cars)) # ['audi', 'bmw', 'subaru', 'toyota']
print("\nHere is the original list again:")
print(cars) # ['bmw', 'audi', 'toyota', 'subaru']

     列表反转

# 列表反转
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(cars)
cars.reverse()
print(cars)  # ['subaru', 'toyota', 'audi', 'bmw']

     

 

复制

# 列表复制 copy
name_list = ['tom', 'Lily', 'Rose']
name_list2 = name_list.copy()
print(name_list2)  # ['tom', 'Lily', 'Rose']

 列表的遍历

# 列表的遍历
name_list = ['tom', 'Lily', 'Rose']
# while
i = 0
while i < len(name_list):
    print(name_list[i])
    i += 1
# for 1
for i in name_list:
    print(i)

# for 2
i = 0
for i in range(len(name_list)):
    print(name_list[i])

遍历部分列表

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("Here are the first three players on my team:")
for player in players[:3]:
    print(player.title())

复制列表

# 复制列表
number = [0, 1, 5, 7, 8, 12, 2]
number3 = number[:]
print(number3) # [0, 1, 5, 7, 8, 12, 2]
number.append(50)
print(number3) # [0, 1, 5, 7, 8, 12, 2]

# 此类复制列表  源列表一旦变化  复制后的列表也会变化
number2 = number # [0, 1, 5, 7, 8, 12, 2]
print(number2)
number.append(20)
print(number2)  # [0, 1, 5, 7, 8, 12, 2, 20]

分配办公室

# 综合运用 随机分办公室 三个办公室 8为老师 8位老师随机分配到3个办公室
teacher = ['tom', 'google', 'alex', 'sde', 'goad', 'colin', 'gila', 'pot']
classroom = [[], [], []]
for i in teacher:
     classroom[random.randint(0, 2)].append(i)
print(classroom)  # [['alex'], ['google', 'sde', 'colin', 'pot'], ['tom', 'goad', 'gila']]

 元组

     列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的。

     Python将不能修改的值称为不可变的,而不可变的列表被称为元组。

 

 

5 字典

# 字典
# 字典里的数据是以键值对形式出现和数据的顺序没有关系
# 无论后其数据如何变化,只要按照对应的键的名字查找数据
# 字典要求 1大括号 2键值对形式出现 3逗号隔开
# 创建有数据的字典
dict1 = {'name': 'Tom', 'age': 20, 'gander': ''}
print(dict1)  # {'name': 'Tom', 'age': 20, 'gander': '男'}
print(type(dict1))  # <class 'dict'>


# 创建空字典
# 法一
dict2 = {}
# 法二
dict3 = dict()
print(type(dict3))  # <class 'dict'>

# 字典常见操作  下标变为key值
# 新增id的值为110
dict1['id'] = 110
print(dict1)  # {'name': 'Tom', 'age': 20, 'gander': '男', 'id': 110}
# 再次覆盖已存在key的值就会覆盖原来的值
dict1['name'] = 'Rose'
print(dict1)  # {'name': 'Rose', 'age': 20, 'gander': '男', 'id': 110}

# 删除数据 del()  clear(): 清空字典
# del()
del dict1['name']  # {'age': 20, 'gander': '男', 'id': 110}
print(dict1)
# clear()
dict1.clear()
print(dict1)

# 修改数据 key存储可修改 不存在就新增
dict1['name'] = 'Lily'
print(dict1)  # {'age': 20, 'gander': '男', 'id': 110, 'name': 'Lily'}

dict1['names'] = 's'
print(dict1)  # {'age': 20, 'gander': '男', 'id': 110, 'name': 'Lily', 'names': 's'}

# 查找字典
# 法一 key值
print(dict1['name'])  # Lily
# 法二 get(key,默认值) key不存在则返回第二个参数(默认值),如果省略第二个参数,则返回None
print(dict1.get('name'))  # Lily
print(dict1.get('id'))  # None
print(dict1.get('id', 110))  # 110
# 法三 keys() 返回可迭代对象
print(dict1)  # {'name': 'Lily', 'names': 's'}
print(dict1.keys())  # dict_keys(['name', 'names']) key值
for key in dict1.keys():
    print(dict1[key])
# 法四 values() 返回可迭代对象
print(dict1.values())  # dict_values(['Lily', 's']) values值
for value in dict1.values():
    print(value)
# 法五 items() 返回可迭代对象 存储的是元组 元组数据1是字典里的key 元组数字据二是字典的值
print(dict1.items())  # dict_items([('name', 'Lily'), ('names', 's')])    
for item in dict1.items():
    print(item)
# 遍历字典的键值对  元组数据1是字典里的key 元组数字据二是字典的值
for key, value in dict1.items():                       # key value 可变其他词汇
    print(f'{key}={value}')  # name=Lily names=s

6 集合

# 创建集合 可变类型
# 1集合数据不允许重复 重复的数据只显示一次(去重)
# 2并且没有顺序
# 3{}或set() 创建空集合只能用set()
s1 = {10, 20, 20, 40, 50}
print(s1)  # {40, 10, 20, 50}
s3 = set('abcdefg')  # 集合没有顺序
print(s3)  # {'c', 'd', 'f', 'g', 'a', 'e', 'b'}
# 空集合
s4 = set()
print(s4)  # set()
print(type(s4))  # <class 'set'>
s5 = {}
print(type(s5))  # <class 'dict'>

# 增加单一数据 add() 如果已有则不会增加 有去重功能
s1.add(100)
print(s1)  # {100, 40, 10, 50, 20}
s1.add(100)  # {100, 40, 10, 50, 20}
# 增加序列update()
s1.update([50, 60])
print(s1)  # {100, 40, 10, 50, 20, 60}

# 集合删除数据
# remove 删除集合中的指定数据,如果属不存在会报错
s1.remove(100)
print(s1)  # {40, 10, 50, 20, 60}
# s1.remove(100)  # KeyError: 100 报错
# discard() 删除集合指定数据,数据不存在也不会报错
s1.discard(100)  # {40, 10, 50, 20, 60} 不会报错
print(s1)
# pop() 随机删除集合中某个数据,并返回这个数据
num = s1.pop()
print(s1)  # {10, 50, 20, 60}
print(num)  # 40

# 集合查找数据 in 和 not in
print(50 in s1)  # True
print(50 not in s1)  # False

7 公共操作

运算符公共操作

# 运算符 +合并 *复制 in元素是否存在 not in
# 字符串
str1 = 'av'
str2 = 'bdb'
# 列表
list1 = [1, 2]
list2 = [10, 20]
# 元组
t1 = (1, 2)
t2 = (10, 20)
# 字典
dict1 = {'name': 'python'}
dict2 = {'age': 30}

# +: 合并 字典不支持合并
print(str1+str2)  # avbdb
print(list1+list2)  # [1, 2, 10, 20]
print(t1+t2)  # (1, 2, 10, 20)

# *:复制 字典不支持复制
print(str1 * 5)  # aaaaaaaaaa
# 打印5个-:
print('-'*5)  # -----
print(list1*5)  # [1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
print(t1*5)  # (1, 2, 1, 2, 1, 2, 1, 2, 1, 2)

# in  not in
# 字符串
print('a' in str1)  # True
print('a' not in str1)  # False
# 列表
print(1 in list1)  # True
# 元组
print(1 in t1)  # True
# 字典
print('name' in dict1)  # True
print('name' in dict1.keys())  # True
print('name' in dict1.values())  # False

公共方法

# 公共方法
# len 计算容器中元素的个数
print(len(str1))  # 2
print(len(list1))  # 2
print(len(t1))  # 2
print(len(dict1))  # 1

# max() 返回容器中元素最大值
print(max(list1))  # 2
print(max(str1))   # v

# min() 返回容器中元素最小值
print(min(list1))  # 1

# range(start,end,step) 迭代
# range()的三种创建方式
# 第一种
r = range(10)  # 默认从0开始 默认步长为1
print(r)  # range(0, 10)
print(list(r))  # 用于查看range对象中的整数序列 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 第二种 (start,stop)
r = range(1, 10)  # 指定从1开始10结束不包含10
print(list(r))  # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 第三种 (start,stop,step)
r = range(1, 10, 2)  # 从1开始 到10结束不包含10 步长为2
print(list(r))  # [1, 3, 5, 7, 9]
# 判断指定整数是否在序列r中存在 使用in 或者 not in
print(10 in r)  # False
print(9 in r)  # True
print(10 not in r)  # True
# 只有当使用到的时候才会创建 一般用于for循环

# enumerate 将一个可遍历的数据对象组合为一个索引序列,
# 同时列出数据和数据下标 一般用在for循环中
# enumerate(可遍历对象,start=0) start参数用来设置遍历数据的下标的起始值,默认为0
list3 = ['a', 'b', 'c', 'f', 'l']
for i in enumerate(list3):
    print(i)  # (0, 'a') (1, 'b') (2, 'c') (3, 'f') (4, 'l')  (小标,数据)
for i in enumerate(list3, start=1):
    print(i)  # (1, 'a')(2, 'b')(3, 'c')(4, 'f')(5, 'l')

# del或del() 删除
del str1
# print(str1)  # NameError: name 'str1' is not defined
del list1[0]
print(list1)  # [2]
del t1
del dict1['name']
print(dict1)  # {}

容器类型转换

# 容器类型转换
# tuple() 将某个序列转换为元组
print(type(tuple(list1)))  # <class 'tuple'>
# list() 将某个序列转换为列表
print(type(list(t2)))  # <class 'list'>
# set() 将某个序列转换为集合
print(type(set(list1)))  # <class 'set'>  集合带有去重功能 原来的数据会被去重
print(type(set(t2)))  # <class 'set'>

8 推导式 

# 推导式 列表 字典 集合
# 化简代码

列表推导式

# 列表推导式
# 用一个表达式创建一个有规律的列表或控制一个有规律列表
# 创建一个0-10的列表
# while实现
list1 = []
i = 0
while i<10:
    list1.append(i)
    i += 1
print(list1)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# for实现
list2 = []
for i in range(10):
    list2.append(i)
print(list2)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 列表推导式实现
list3 = [i for i in range(10)]    # 第一个i为循环返回值
print(list3)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

带if的推导式

# 带if的列表推导式
# 创建0-10的偶数列表
# 法一 range
list4 = [i for i in range(0,10,2)]
print(list4)  # [0, 2, 4, 6, 8]
# 法二
list5 = [i for i in range(10) if i % 2 == 0]
print(list5)  # [0, 2, 4, 6, 8]

带多个if的推导式

# 多个for循环实现推导式
# 建立[(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
list6 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list6)  # [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

字典推导式

# 字典推导式
# 快速合并列表为字典 或提取字典中的目标数据
# 创建key1-5,value是这个数的2次方
dict1 = {i: i**2 for i in range(1, 6)}
print(dict1)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 将两个列表合并为一个字典
list7 = ['name', 'age', 'gender']
list6 = ['tom', '20', 'man']
dict2 = {list7[i]: list6[i] for i in range(len(list6))}
print(dict2)  # {'name': 'tom', 'age': '20', 'gender': 'man'}
# 提取字典的目标数据
counts = {'MBP': 28, 'HP': 250, 'DELL': 201, 'Lenovo': 199}
# 提取电脑数量大于等于200的字典数据
print({key: value for key, value in counts.items() if value >= 200})  # {'HP': 250, 'DELL':

集合推导式

# 集合推导式
# 创建一个数据为下方列表的2次方
list8 = [1, 1, 2]
set1 = {i ** 2 for i in list8}
print(set1)  # {1, 4}  集合有去重功能

9 函数 

# 定义函数  先定义再调用
# 函数执行过程 当调用函数时,会执行函数内容 定义时不会执行函数 只会定义
def sel_func():
    print('hello world')
sel_func()

加法

# 完成加法运算
def add(a, b):
    print(a + b)


def add2(a, b):
    return a + b


# 调用函数

add(4, 6)  # 10
print(add2(6, 5))  # 11

函数说明文档

# 函数说明文档 快速查看函数的作用
# help(len)  help 查看函数的说明文档
# 位置 定义后第一行""""""
def sum(a, b):
    """求和函数"""
    return a + b


help(sum)  # 求和函数
print(sum(1, 5))  # 6


# 说明文档高级使用  “”“回车
def sum_num(a, b):
    """
    求和函数
    :param a:  参数1
    :param b: 参数2
    :return: 返回值
    """
    return a + b

函数嵌套

# 函数嵌套调用
def multiply(a, b):
    return a * b


def multiplyAdd(a, b):
    return multiply(a, b) + b


print(multiplyAdd(4, 6))  # 30


# 打印一条横线
def line():
    return '-' * 20


# 打印多条
for _ in range(4):
    print(line())


# 求两个数的平均值
def average(a, b):
    print(sum(a, b) / 3)


average(4, 6)  # 3.3333333333333335

 修改全局变量

# 修改全局变量  global 关键字
a = 100


def testA():
    print(a)


def testB():
    global a
    a = 200
    print(a)


testA()  # 100
testB()  # 200   此时a是局部变量
print(a)  # 100   global 后为200


# 返回值作为参数传递
def one():
    return 50


def two(num):
    print(num)


two(one())  # 50


# 多个返回值
def return_num():
    return 1, 2  # 返回的是一个元组
    # return 后面可以返回 元组 列表 字典


print(return_num())  # (1, 2)

函数参数

# 函数参数
# 位置参数
def user_info(name, age, gender):
    print(f'名字为{name},年龄{age},性别{gender}')


user_info('tom', 20, '')  # 名字为tom,年龄20,性别男


# 关键字参数  通过键=值的形式加以指定  指定参数名 就可以不按顺序写参数
def user_info2(name, age, gender):
    print(f'名字为{name},年龄{age},性别{gender}')


user_info2('tom', age=20, gender='')  # 名字为tom,年龄20,性别男
user_info2('小明', gender='', age=16)  # 名字为小明,年龄16,性别男


# 缺省参数 默认参数
def user_info3(name, age, gender=''):
    print(f'名字为{name},年龄{age},性别{gender}')


user_info3('tom', 20)  # 名字为tom,年龄20,性别女


# 不定长参数 可变参数  组包过程
# 包裹位置
def user_info4(*args):  # args是元组类型
    print(args)


user_info4('Tom')  # ('Tom',)
user_info4('Tom', '18')  # ('Tom', '18')


# 包裹关键字
def user_info5(**kwargs):  # kwargs是一个字典
    print(kwargs)


user_info5(name='Tom', age=18, id=110)  # {'name': 'Tom', 'age': 18, 'id': 110}

 

 

让实参变成可选的

# 让参数变成可选
def get_formatted_name(first_name, last_name, middle_name=''):
    """返回整洁的姓名"""
    if middle_name:
        full_name = first_name + ' ' + middle_name + ' ' + last_name
    else:
        full_name = first_name + ' ' + last_name
    return full_name.title()


musician = get_formatted_name('jimi', 'hendrix')
print(musician)
musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)

导入模块

def make_pizza(size, *toppings):   # pizza.py 文件中
    """概述要制作的比萨"""
    print("\nMaking a " + str(size) +
          "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)

 making_pizzas.py 文件中导入make_pizza模块

import pizza
pizza.make_pizza(16, 'pepperoni')
pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

 导入特定的函数

# 你还可以导入模块中的特定函数,这种导入方法的语法如下:
from module_name import function_name
# 通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:
from module_name import function_0, function_1, function_2
# 对于前面的making_pizzas.py示例,如果只想导入要使用的函数,代码将类似于下面这样:
from pizza import make_pizza 
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
# 使用as给模块指定别名
import pizza as p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

# 导入模块所以函数
from pizza import *
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese') 

 

拆包

# 拆包
# 元组
def return_num():
    return 100, 200
num1, num2 = return_num()
print(num1)  # 100
print(num2)  # 200
print(return_num())  # (100, 200)

# 字典
dict1 = {'name': 'Tom', 'age': 18}
a, b = dict1
# 对字典进行拆包,取出来的是字典的key
print(a)  # name
print(b)  # age
print(dict1[a])  # Tom
print(dict1[b])  # 18

交换变量的值

# 交换变量的值
a = 10
b = 20
# 常规 使用中间变量
c = 0
c = a
a = b
# 简便
a, b = 10, 20
a, b = b, a
print(f'a={a},b={b}')  # a=20,b=10

引用

# 引用 python中值都是靠引用来传递的
# 使用id() 来判断一个变量是否为同一个值的引用
# int
a = 1
b = a
print(b)  # 1
print(id(a))  # 140703583966880
print(id(b))  # 140703583966880
# 修改a的值
a = 2
print(id(a))  # 140703583966912
print(id(b))  # 140703583966880

# 列表
aa = [10, 20]
bb = aa   # 数据传递时永远指向同一个id
print(id(aa))  # 2829476104832
print(id(bb))  # 2829476104832

aa.append(30)
print(bb)  # [10, 20, 30]
print(id(aa))  # 2829476104832
print(id(bb))  # 2829476104832

引用当实参

# 引用当实参传递
def test1(a):
    print(a)
    print(id(a))
    a += a
    print(a)
    print(id(a))

# int: 计算前面id值不同
b = 100
test1(b)  # 不可变类型 id 不一样

# 列表: 计算前后id相同
c = [11, 22]
test1(c)  # 可变类型 id 一样

可变类型和不可变类型

# 可变类型 不可变类型
# 可变     列表 字典 集合
# 不可变   整形 浮点型 字符串 元组

 10 简易学员管理系统

# 函数加强
# 学院管理系统

info = []


# 添加学员
def add_student():
    print("请输入该学员的信息")
    name = input("学员的姓名")
    age = input("学员的年龄")
    gender = input("学员的性别")
    student = {'name': name, 'age': age, 'gender': gender}
    info.append(student)
    print(info)


# 删除学员
def delete_student(name):
    for item in info:
        if name == item['name']:
            info.remove(item)
    print(info)


# 修改学员信息
def modify_student(name):
    for item in info:
        if name == item['name']:
            print(f'原始学员信息{item}')
            age = input("请输入修改后的年龄")
            gender = input("请输入修改后的性别")
            item['age'] == age
            item['gender'] = gender
    print(info)


# 查询所以学员信息
def find_all():
    print(info)


# 显示界面
print("欢迎来到管理界面")
while True:
    print("a: 添加学员")
    print("d: 删除学员")
    print("m: 修改学员")
    print("f: 查找所以学员")
    print("q: 推出系统")
    flag = input("请输入您要执行的操作")
    if flag == 'a':
        add_student()
    elif flag == 'd':
        name = input("请输入姓名")
        delete_student(name)
    elif flag == 'm':
        name = input("请输入姓名")
        modify_student(name)
    elif flag == 'f':
        find_all()
    elif flag == 'q':
        exit()
    else:
        print("输入有误,请重新输入")

 11 lambda 表达式

# lambda 表达式 化简代码  形式:lambda 参数列表 : 表达式
# 一个函数只有一个返回值,并且只有一句代码,可以采用lambda
# 参数可有可无   能接收任何数量的参数但是只能返回一个表达式的值


def fn1():
    return 100


print(fn1)  # <function fn1 at 0x0000018E8AEE6430>
print(fn1())  # 100
# lambda
fn2 = lambda: 100
print(fn2)  # 内存地址 <function <lambda> at 0x000001939C7693A0>
print(fn2())  # 100


# 计算a+b
def add(a, b):
    return a + b


print(add(1, 3))  # 4

# lambda
add2 = lambda a, b: a + b
print(add2(1, 3))  # 4

# 参数形式
# 无参数
fn2 = lambda: 100
print(fn2())
# 一个参数
fn3 = lambda a: a
print(fn3('hello'))  # hello
# 默认参数
fn4 = lambda a, b, c=100: a + b + c
print(fn4(10, 20))  # 130
# 可变参数  *args
fn5 = lambda *args: args  # 返回元组
print(fn5(10, 20, 50, 60))  # (10, 20, 50, 60)
# 可变参数  **kwargs
fn6 = lambda **kwargs: kwargs  # 返回字典
print(fn6(name='python', age=20))  # {'name': 'python', 'age': 20}

# lambda应用
# 带判断的lambda
fn7 = lambda a, b: a if a > b else b
print(fn7(100, 500))  # 500

# 列表数据按字典key的值排序
students = [
    {'name': 'tom', 'age': 50},
    {'name': 'Rose', 'age': 10},
    {'name': 'Jack', 'age': 2}
]
# 按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)

# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)

 12 高阶函数

import functools

# 高阶函数  函数作为参数传入
# 内置函数
# abs()  绝对值
print(abs(-60))  # 60
# round() 绝对值
print(round(1.4))  # 1


# 需求:任意两个数字,按照指定要求整理数字后再进行求和计算
def add_abs(a, b):
    return abs(a) + abs(b)


# 更加灵活 f 接收函数
def sum_num(a, b, f):
    return f(a) + f(b)


print(add_abs(-10, 90))  # 100
print(sum_num(-10, -60, abs))  # 70

# 内置高阶函数
# map(func,lst) 将传入的函数变量func作用到lst变量中的每个元素中并将结果组成新的列表
# 计算list1序列中各个数字的2次方
list1 = [1, 2, 3, 4, 5]


def func(x):
    return x ** 2


print(list(map(func, list1)))  # [1, 4, 9, 16, 25]


# reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列下一个元素做累加计算
# 计算list1序列中各个数字的累加积   需要用到functools
def func2(a, b):
    return a + b


result = functools.reduce(func2, list1)
print(result)  # 15

# filter(func, lst)
# 用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象。
# 如果要转换列表可以使用lst()来转换
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def fun(x):
    return x % 2 == 0

print(filter(fun, lst))  # <filter object at 0x000001FFFBE6B610>
print(list(filter(fun, lst)))  # [2, 4, 6, 8, 10]

13 类

创建类

 

# 首字母大写的名称指的是类,这个类定义中的括号是空的,因为我们要从空白创建这个类
class Dog():
    """一次模拟小狗的简单尝试"""

    # 法__init__()是一个特殊的方法,每当你根据Dog类创建新实
    # 例时,Python都会自动运行它
    def __init__(self, name, age):
        """初始化属性name和age"""
        self.name = name
        self.age = age

    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over!")


#  实例化
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")

 类的静态变量   

class foo():
member1
member2
...
self.member1
foo.member2

其中的两个成员member1, member2有什么区别。。。这才知道python中也有自己的全局静态变量。

其实例的属性是实例的,如上class中的member1,对它进行+/-操作时,只会对一个相应对象实例产生影响,(其类和该类的其它实例的不受影响)。

如果类的属性是 mutable 对象的话,对此对象*本身*的修改会反映到其他所有实例。python 中定义的静态成员变量,就是类的变量, 只能通过 类.变量名的形式获取
 可以用来查看此类实例了多少个实体

使用类

class Car():
    """一次模拟汽车的简单尝试"""

    def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        # 设置初始值
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回整洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        """打印汽车里程"""
        print('里程为'+str(self.odometer_reading))

    def update_odometer(self,mileage):
        """方法里修改属性"""
        self.odometer_reading = mileage

    def increment_odometer(self,miles):
        """自增"""
        self.odometer_reading += miles


my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# 直接修改属性
my_new_car.odometer_reading = 30
my_new_car.read_odometer()  # 里程为30
# 方法里修改属性
my_new_car.update_odometer(50)
my_new_car.read_odometer()  # 里程为50

继承

class Car():
    """一次模拟汽车的简单尝试"""

    def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        # 设置初始值
        self.odometer_reading = 0

    def get_descriptive_name(self):
        """返回整洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        """打印汽车里程"""
        print('里程为' + str(self.odometer_reading))

    def update_odometer(self, mileage):
        """方法里修改属性"""
        self.odometer_reading = mileage

    def increment_odometer(self, miles):
        """自增"""
        self.odometer_reading += miles

    def fill_gas_tank(self):
        print('油箱')


my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# 直接修改属性
my_new_car.odometer_reading = 30
my_new_car.read_odometer()  # 里程为30
# 方法里修改属性
my_new_car.update_odometer(50)
my_new_car.read_odometer()  # 里程为50


# 创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方
# 法__init__()需要父类施以援手
class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)
        # 独有属性
        self.battery_size = 70

    def describe_battery(self):
        """独有方法"""
        print('电池量'+str(self.battery_size))

    def fill_gas_tank(self):
        """重写父类方法"""
        print('电动车没有油箱')


my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
# 将实例可用作属性

 导入类

# 要建立python package 而且 路径是根路径
# Restaurant类在此目录下 import 可以加多个类 * 表示所以
from pythonintomaster.nine.restaurant import Restaurant


class IceCreamStand(Restaurant):

    def __init__(self, restaurant_name, cuisine_type, flavors, number_served=0):
        super().__init__(restaurant_name, cuisine_type, number_served)
        self.flavors = flavors

    def show_flavors(self):
        print(self.flavors)


my_restaurant = IceCreamStand('ll', '川菜', '冰淇淋', 60)
print(my_restaurant.flavors)

 14 文件

  文件操作

# 文件操作
# 打开文件 或者创建一个新文件
# open(file_name,mode) mode:只读r ,只写入w,追加 a
f = open('test.txt', 'w')
# 读写操作 write() read()
f.write('aaa')
# 关闭文件
f.close()

读取文件

 

# open 打开文件 返回文件对象
# 关键字with在不再需要访问文件后将其关闭 你也可以调用open()和close()来打开和关闭文件
with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    # 该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因
    # 为read()到达文件末尾时返回一个空字符串
    print(contents.rstrip())

# 逐行读取
# 要以每次一行的方式检查文件,可对文件对象使用for循环
filename = 'pi_digits.txt'
with open(filename) as file_object:
    # 每行的末尾都有一个看不见的换行符,而
    # print语句也会加上一个换行符,因此每行末尾都有两个换行符
    for line in file_object:
        print(line.rstrip())

# 创建一个包含文件各行内容的列表
# readlines读出每行放入到列表中 赋给lines 可以在with之外打印列表内容
filename = 'pi_digits.txt'
with open(filename) as file_object:
    lines = file_object.readlines()
for line in lines:
    print(line.rstrip())
# 若需要去掉两边的空白 采用strip

 文件模式

  

#  文件模式
# 只读r  文件不存在读不了  文件指针将会放到文件的开头
f1 = open('test.txt', 'r')
print(f1.read())  # aaa

# 追加a  如果原文件不

# 访问模式省略时  文件不存在 不会新建 ,不能写只能读
f1 = open('test.txt')
print(f1.read())
f1.close()

# 读操作
# read(num) num表示从文件中读取数据的长度 不写参数就是所有数据
f2 = open('test.txt', 'r')
print(f2.read(1))  # a  先读取了1个字节 在读取就从此从此操作之后的字节
print(f2.read())  # aa
f2.close()

# readlines()
# 可以按照行的方式把整个文件中的内容进行一次性读取
# 并返回一个列表,其中每一行都数据为一个元素
f3 = open('test1.txt')
print(f3.readlines())  # ['i love china\n', 'i really love china\n']
f3.close()

# readline() 一次读取一行内容
f4 = open('test1.txt')
print(f4.readline())  # i love china
print(f4.readline())  # i really love china
f4.close()
filename = 'programming.txt'
# 读取模式('r')、写入模式('w')、
# 附加模式('a')或让你能够读取和写入文件的模式('r+')
with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

# 函数write()不会在你写入的文本末尾添加换行符,因此如果你写入多行时指定换行符
with open(filename, 'w') as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

 

 

 

 访问模式特点

# 访问模式的特点
# 模式带b的都是以二进制文件操作
# 带+的都是可读可写的
# 带r带w的文件指针都在开头位置
# 带a的文件指针都在结尾

# seek函数 移动文件指针
# 文件对象.seek(偏移量,起始位置)
# 0:文件开头 1:当前位置 2:文件结尾

   简单操作

# 简单操作
# r 改变指针位置 改变读取数据开始位置或把文件指针放到末尾(无法读取数据)
f5 = open('test1.txt')
f5.seek(10, 0)
print(f5.read())  # na i really love china i exceedingly love china
f5.seek(0, 2)
print(f5.read())
f5.close()
# a 改变文件指针位置,做到可以读取出来数据
f6 = open('test1.txt', 'a+')
f6.seek(10, 0)
print(f6.read())  # na i really love china i exceedingly love china
f6.close()

 文件备份 

# 文件备份
# 需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能
# (备份文件名为xx[备份]后缀) 例如:test[备份].txt
# me
file_name = input('请输入您需要备份的文件名')
old_file = open(file_name, 'r')
new_file = open(f'{file_name}[备份].txt', 'w')
new_file.write(old_file.read())
old_file.close()
new_file.close()
# teacher
# 1 接收用户输入目标文件名
old_name = input('请输入您要备份的文件名:')
# 2 规划备份文件名
# 获取文件后缀点的下标
index = old_name.rfind('.')
if index > 0:   # 不允许文件名为.txt
    postfix = old_name[index:]
new_name = old_name[:index] + '[备份]' + postfix
# 3 备份文件写入数据
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')
# 将源数据写入备份文件
# 如果不确定目标文件大小,循环读取,当读取的数据没有了,就终止循环
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)
old_f.close()
new_f.close()

 文件 和文件夹操作

import os
# 文件和文件夹操作
# 需要导入os模块 import os  使用os.函数名()

# 文件重命名 os.rename(目标文件,新文件名)
os.rename('test.txt', 'text.txt')

# 删除文件 os.remove(目标文件)
os.remove('text.txt')

# 创建文件夹
os.mkdir('file')

# 文件夹重命名
os.rename('aa', 'bbbb')

# 删除文件夹
os.rmdir('file')

# 获取当前目录
print(os.getcwd())  # D:\python\python\pythonProject\file

# 改变默认目录
os.mkdir('aa')
os.chdir('aa')
os.mkdir('bb')

# 获取目录列表   获取某个文件夹所以文件 返回一个列表
print(os.listdir())  # ['aa', 'file', 'file.py', 'file2.py', 'test1.txt', 'test1.txt[备份].txt', 'text.txt']
print(os.listdir('aa'))  # ['bb']

 应用

import os
# 需求:批量修改文件名,既可以添加指定字符串,又能删除指定字符串
# 当前文件重命名为python_xxxx
file = os.listdir()
print(file)
for item in file:
    new_item = 'python_' + item
    os.rename(item, new_item)

 异常

 

# 处理 ZeroDivisionError 异常
try:
    print(5 / 0)
except ZeroDivisionError:
    print("You can't divide by zero!")

# 包含一个else代码块;依赖于try代码块成功执行的代码都应放到else代码块中
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
    first_number = input("\nFirst number: ")
    if first_number == 'q':
        break
    second_number = input("Second number: ")
try:
    answer = int(first_number) / int(second_number)
except ZeroDivisionError:
    print("You can't divide by 0!")
else:
    print(answer)

# 处理 FileNotFoundError 异常
filename = 'alice.txt'
try:
    with open(filename) as f_obj:
        contents = f_obj.read()
except FileNotFoundError:
    msg = "Sorry, the file " + filename + " does not exist."
    print(msg)
else:
    # 处理如果文件存在之后的操作
    pass

# 当候你希望程序在发生异常时一声不吭,就像什么都没有发生一样继续运行
try:
    # 你的操作
    pass
except EOFError:
    # 此时出现异常不吭声
    pass
else:
    # 之后操作
    pass

json格式

 

# 模块json让你能够将简单的Python数据结构转储到文件中
# ,并在程序再次运行时加载该文件中的数据,你还可以使用json在Python程序之间分享数据
# JSON数据格式并非Python专用的,
# 这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。

import json
# 写入json格式 json.dump
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
    # 函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象
    json.dump(numbers, f_obj)

# 读取json格式json.load
filename = 'numbers.json'
with open(filename) as f_obj:
    numbers = json.load(f_obj)

print(numbers)

 

测试

方法

 

# 测试需要导入unittest
import unittest
# # 导入需要测试的方法
from pythonintomaster.ten.name_function import get_formatted_name


class NamesTestCase(unittest.TestCase):
    """测试name_function.py"""

    def test_first_last_name(self):
        """能够正确地处理像Janis Joplin这样的姓名吗?"""
        formatted_name = get_formatted_name('janis', 'joplin')
        # 断言方法用来核实得到的结果是否与期望的结果一致。
        self.assertEqual(formatted_name, 'Janis Joplin')


unittest.main()

 

测试类

 setup()方法

# 法setUp(),让我们只需创建这些对象一 次,并在每个测试方法中使用它们
import unittest
from pythonintomaster.eleven.survey import AnonymousSurvey


class TestAnonymousSurvey(unittest.TestCase):
    """针对AnonymousSurvey类的测试"""

    def setUp(self):
        """
        创建一个调查对象和一组答案,供使用的测试方法使用
        """
        question = "What language did you first learn to speak?"
        self.my_survey = AnonymousSurvey(question)
        self.responses = ['English', 'Spanish', 'Mandarin']

    def test_store_single_response(self):
        """测试单个答案会被妥善地存储"""
        self.my_survey.store_response(self.responses[0])
        self.assertIn(self.responses[0], self.my_survey.responses)

    def test_store_three_responses(self):
        """测试三个答案会被妥善地存储"""

        for response in self.responses:
            self.my_survey.store_response(response)
        for response in self.responses:
            self.assertIn(response, self.my_survey.responses)

    unittest.main()

 global 关键字 全局变量

 

# python global 全局变量
x = 5
def fun_a():
    print(x)
    
def fun_b():
    x = x+1
    print(x)
fun_a()
fun_b()  # 报错,

 

 

 

 x = 5
def fun_a():
    print(x)
    
def fun_b():
    global x   # global 
    x = x+1
    print(x)
fun_a() # 5
fun_b()  # 6

 

posted @ 2021-07-04 15:31  coline  阅读(321)  评论(0)    收藏  举报