day03-课堂笔记

# 数据类型
"""
# int
# py2存放长整型:long
# py3环境,所以整型均由int存储
num1 = -10
num2 = 100000000000000000000000000000000000000000888
print(num1, type(num1))
print(num2, type(num2))

# complex
cp = complex(4, 5)
print(cp, type(cp))

# float
f = float(3)
print(f, type(f))

# bool: 在内存中就是存储0、1
print(True, type(True)) # True 'bool'

# isinstance(obj, type) # 判断某对象是否是某类型
print(isinstance(3.14, int))
print(isinstance(True, bool)) # True
print(isinstance(True, int)) # True

res = True
print(type(res) == int) # False

"""

# 字符串
# '' "" """ """
print('good "boy"')

s = 'hello world!!!'
# 索引取字符 *****
print(s[1]) # 正向索引从0开始
print(s[-4]) # 反向索引从-1开始

# 切片 *****
res = s[6:-3:] # 顾头不顾尾
print(res)

# 列表与字符串相互转换 *****
res = s.split(' ')
print(res) # 按空格拆分为list
res = '-'.join(res)
print(res)

# 替换 ****
ns = s.replace('!', '.')
print(ns)
print(s)
ns = s.replace('!', '.', 1)
print(ns)
ns = s.replace('!!!', '.')
print(ns)

# 查找子字符串的出现次数 ***
ct = s.count('o', 0, 6) # sub starIndex endIndex
print(ct, )

# 字符串的长度 *****
print(len(s))

# 判断是否能转换为int *****
print('12'.isdigit())

# 大小写切换
print('abc'.upper())
print('ABC'.lower())

# list: 可变
# 自身指向的内存空间(地址)不发生改变时,可以改变地址指向的内存空间中的内容
ls = []
print(id(ls))
# 增删改查
ls.append(1)
ls.append(2)
ls.append(3)
print(ls)
print(id(ls))
# 插入
ls.insert(len(ls), 4)
print(ls)
ls.insert(0, 0)
print(ls)
# 删
del ls[2]
print(ls)
ls = [0, 1, 3, 4, 0, 0]
ls.remove(0)
print(ls)
res = ls.pop(4)
print(ls, res)

# 翻转
ls.reverse()
print(ls)

# 排序
ls.sort(reverse=True)
print(ls)

# 多值添加
ls = [0, 1, 2]
ls.extend('abc')
print(ls)
ls.extend([1, 10, 20, 30])
print(ls)

# 可以被for循环的类型就叫可迭代类型
for v in 'abc':
print(v)

for o in [10, 20, 30]:
print(o)

# 嵌套
ls = [
[1, 2, 3],
[4, 5, 6, [10]],
'xyz'
]
print(ls)
# 取[1, 2, 3]子list
print(ls[0])
# 取数字5
print(ls[1][1])
print(ls[1][3][0])
# 取字母z
print(ls[2][2])


# 元组:不可变的list
# 元组(不可变)与列表(可变)的转化
print(tuple([1, 2, 3]))
print(list((1, 2, 3)))


# 字典: 没有索引(无序存储),按key取值
dic = {}
print(dic, type(dic))

# 增删改查
dic['name'] = 'Bob'
print(dic)
dic['name'] = 'Jerry'
print(dic)
del dic['name']
print(dic)
# 按[key]查
# print(dic['name']) # key不存在就抛异常
# 带默认值取值 *****
dic['name'] = 'Bob'
print(dic.get('name', 'key不存在'))

# 删除
dic = {
'name': 'Owen',
'age': 18,
'gender': 'God'
}
res = dic.pop('age')
print(res)
print(dic)

# 从最后删除,返回(k, v)
k, v = dic.popitem()
print(k, v)

dic = {'name': 'Owen', 'salary': '66666', 'height': 180}
# 设置默认值:没有该key添加并设置默认值,如果有,不做操作
dic.setdefault('salary', '88888')
print(dic)
dic['height'] = 185
print(dic)

# 通过keys初始化字典
dic = dic.fromkeys(('name', 'age', 'gender'), None) # 通过默认值给None一般省略
print(dic)



# 多值更新
dic = {'name': 'Engo', 'salary': 100}
dic.update({'name': "Egon", 'age': 58, 'gender': '未知'})
print(dic)

# 类列表类型,不能直接通过index取值,但可以被for循环迭代取值
print(dic.keys())
print(dic.values())
print(dic.items())

for k in dic.keys():
print(k, ":", dic[k])
print('------------------------------------')
for v in dic.values():
print(v)

print('------------------------------------')
for k, v in dic.items(): # *****
print(k, v)

a, b, c = [1, 2, 3]
print(c)
a, b, _ = (1, 2, 3)
print(a)


# 嵌套: JSON
dic = {
'students': [
{
'name': 'Bob',
'id': 1,
'gender': '男'
},
{
'name': 'Tom',
'id': 2,
'gender': '女'
}
],
'teachers': []
}

stus = dic['students'] # list
tom_stu = stus[1] # dic
name = tom_stu['name']
print(name)
print(dic['students'][1]['name'])
print('======================')
for k, v in dic.items():
# 只遍历学生
if k == 'students':
for stu in v:
for s_k, s_v in stu.items():
print(s_k, ":", s_v)
print('--------------')
if k == 'teachers':
pass


# 无序、无key、无索引集合

# set特定:存放数据具有唯一性:去重
# 应用场景:处理大量有重复信息的数据,对其去重,如果需要取值,将其转化为list
s = set()
print(type(s), s)

# 增
s.add('a')
s.add('b')
s.add('a')
s.add('b')
s.add('c')
print(s)
# 取值, 遍历(set也提供了自身遍历)
ls = list(s)
print(ls)
# 遍历
for v in s:
print(v)

# 多个关系set完成关系运算
py = {'a', 'b', 'c', 'egon'}
ln = {'x', 'y', 'z', 'egon'}
# 只报python, 反过来Linux
res = py - ln
print(res)
res = ln.difference(py)
print(res)

# 两个都报了的
res = py & ln
res = py.intersection(ln)
print(res)

# 只报一门
res = py ^ ln
res = py.symmetric_difference(ln)
print(res)

# 报名的学生
res = py | ln
res = py.union(ln)
print(res)


# 乱码:存和取所采用的编码不一致

# 编码:ascii,unicode, gbk, gb2312, utf-8

# 电脑组成:硬盘 - 内存 -(二级缓存、一级缓存、cpu寄存器)- cpu

# cpu交互的是用户能识别的数据:字符
# 硬盘中最终存储的数据:0,1的二进制数据(可以直接转化为电脑能识别的高低电频)


# 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表
''' 编码表 对应关系
你好 <=> 000010001001010101
好的 <=> 001010001001010000
'''

# 最早期对应关系:ascii编码表 - 存放的是英文数字与机器二进制的对应关系
# 数字70对应ascii表,指向的是字母'F'
print(chr(70)) # 'F'
print(ord('f')) # 102

# 字符所占字节数
# 1字节 = 8个二进制位 00000000 ~ 11111111 256个数字 -128 ~ 127

# ascii中一个字母或数字占一个字节

# 中文
# GBK: 16个二进制位 15个0到15个1
# 兼容ascii,一个字母或数字占一个字节
# 2w多汉字,用两个字节进行存储

'''
你好 <=> 00000101010101001011 <=> 콱봤
'''
# 日文/韩文:Shift_JIS、Euc-kr

# 国际上交流:
# 一条信息中,可能同时出现英文/中文/日文/韩文,将所有信息存储,且不乱码
# 万国编码表:unicode
# unicode采用两个字节存放数据:utf-8,utf-16
# utf-8采用变长存储:1字节存放数字与英文,3字节存放汉字
# utf-16采用定长存储:均以2字节存放数字,英文,汉字

# 内存中用utf-16存取数据:定长存取效率高(变长需要计算后才存取)
# cpu中与硬盘中,采用utf-8存放数据(utf-8传输更快)

# 操作文件的三步骤
# 1、打开文件
# f被程序持有,文件被操作系统持有
# f = open('file.txt', 'r', encoding='utf-8') # r读文件,文件一定要提前存在
# del f
# f.close()

# 2、操作文件
# data = f.read() # 读所有内容
# print(data)

# data = f.read(2) # 读指定字节数或字符数
# print(data)
# d1 = f.read(1) # 在当前位置接着再读1个字节或字符
# print(d1)

# line = f.readline() # 读取一行
# print(line)

# lines = f.readlines() # 按行,将所有行一次一次读出到list中
# print(lines)

# 3、关闭文件
# f.close() # 操作系统对文件的持有权一定要在文件操作完毕后释放
# del f


w = open(r'file.txt', 'w', encoding='utf-8')
w.write('123\n')
w.flush() # 数据量过大时,可以手动将内存中的数据刷新到硬盘中
w.write('456\n')
w.writelines(['000\n', '111\n', '222\n'])

# 是否可读可写
print(w.readable())
print(w.writable())

w.close()

print('end')




'''
主模式:
r: 文件必须存在的读
w: 文件无需存在的写,无创建,有清空再写
a: 文件无需存在的写,无创建,有在文件最后追加写

从模式:
t: 按文本字符操作数据(默认模式)
b: 按文本字节操作数据
+: 可读可写

了解:
x:新建文件写,如果文件已存在,抛异常
'''

# with open语法
# with open('file.txt', 'x', encoding='utf-8') as f: # 不需要明文书写f.close()
# # data = f.read()
# # print(data)
# print(f.readable())
# print(f.writable())

# 追加模式
# with open('file.txt', 'a', encoding='utf-8') as f:
# f.write('123\n')
# print(123)
# print(123)
# f.write('456\n')
# f.flush()
# f.write('789\n')

# 字节方式操作文件
"""
你好
好的
123
"""
# 注:b操作模式下不需要指定encoding,
# 原因,因为b可以对所有类型数据进行操作,包含文本/视频/音频等各种文件
# 而utf-8只是文本文件的编码方式
# 数据在硬盘中本就以二进制进行存储的,所有b默认操作就是对数据从硬盘到内存的拷贝
# with open('file.txt', 'rb') as f:
# data = f.read()
# print(data)
# # 但如果数据要展现给用户,文本文件就要涉及解码,其他文件需要通过专业工具打开
# print(data.decode('utf-8'))

# with open('file.txt', 'ab') as f:
# f.write(b'\n\xe5\x91\xb5\xe5\x91\xb5')

# r+: 从头开始写, a+:从尾开始写, w+:清空写
with open('file.txt', 'rb+') as f:
print(f.readable())
print(f.writable())
# print(f.read())
f.write(b'999')

'''
123
你好
456
'''
with open('file.txt', 'w', encoding='utf-8') as f:
f.write('123\n你好\n456\n')

# 大前提: 游标操作一定要在b模式下进行操作,因为游标一定按字节进行偏移
# seek(偏移量, 操作位置)
# 操作位置:0,从头开始 1,从当前位置开始 2,从最后开始
# with open('file.txt', 'rt', encoding='utf-8') as f:
# d1 = f.read(7)
# print(d1)
# f.seek(1, 0)
# d2 = f.read(1)
# print(d2)
# seek()在操作位置为0时,可以兼容t模式,但任然按字节进行偏移

with open('file.txt', 'rb') as f:
d1 = f.read(14)
print(d1)
# f.seek(1, 1) # 在当前位置往后偏移1个字节
# f.seek(-1, 1) # 在当前位置往前偏移1个字节

f.seek(-3, 2) # 将鼠标移至到文件末尾,往前偏移3个字节

d2 = f.read(1)
print(d2)

# 文件的修改
# rb+:在当前位置进行覆盖书写
with open('change.txt', 'rb+') as f:
f.seek(14, 0)
print(f.read(2))
f.seek(-2, 1)
f.write(b'16')

# ab+:可以操作游标,但只对读起作用,写任然是最后追加
# with open('change.txt', 'ab+') as f:
# f.seek(14, 0)
# print(f.read(2))
# f.seek(-2, 1)
# print(f.read(2))
# f.write(b'18')


with open('change.txt', 'rb+') as f:
data = f.read()
newData = data.decode('utf-8').replace('16', '016')

f.seek(0, 0)
f.write(newData.encode('utf-8'))




# 复制文件
with open('old.txt', 'r', encoding='utf-8') as f1, open('new.txt', 'w', encoding='utf-8') as f2:
# 文件的循环
for line in f1: # 对可读文件对象直接遍历循环,得到的是一行行内容
print(line)
f2.write(line)

import os
with open('001.png', 'rb') as f1, open('002.png', 'wb') as f2:
for line in f1:
f2.write(line)
# 按指定路径将文件删除
os.remove(r'D:\python周末四期\day03\代码\001.png')



mk = b""
# 计算得到秒传依据
with open('002.png', 'rb') as f:
data = f.read()
# print(data)
length = len(data)
print(length)
# 设置秒传算法:1.截取的部分字节,2.加密字节的算法

# 1.从头开始读10个字节,中间读10个字节,末尾读10个字节
# 2.将所有数据进行拼接
f.seek(0, 0)
d1 = f.read(10)
f.seek(length // 2, 0)
d2 = f.read(10)
f.seek(-10, 2)
d3 = f.read(10)
mk = d1 + d2 + d3

print(mk)

# 实现秒传
with open('200.png', 'rb') as f:
new_mk = b''
f.seek(0, 0)
new_mk += f.read(10)
f.seek(length // 2, 0)
new_mk += f.read(10)
f.seek(-10, 2)
new_mk += f.read(10)
if new_mk == mk:
print('秒传')
else:
print('调用上传方法,进行龟速上传')

# with open('200.png', 'rb+') as f:
# f.seek(-7, 2)
# f.write(b'12')


# 什么是函数:用来完成特定功能的代码块,类似于工具,可以重复不但的去使用

# 为什么要有函数
# 1. 避免代码的冗余
# 2. 让程序代码结构更加清晰
# 3. 让代码具有复用性,便于维护

# while True:
# print('老男孩万岁')

# print('egon:给我买水')
# print('owen:给你哇哈哈')
#
# print('egon:我想和哇哈哈')
# print('egon:给我买水')
# print('owen:给你哇哈哈')
#
# print('egon:我口渴了')
# print('egon:给我买水')
# print('owen:给你哇哈哈')
#
# print('egon:我失恋了')
# print('egon:给我买水')
# print('owen:给你哇哈哈')


# 函数的语法
def get_water(money):
print('egon:给我买水,给你%s' % money)
print('owen:给你哇哈哈')
return '哇哈哈'

res = get_water(2.5)
print(res)
'''
def:定义函数的关键词 *****

def 函数名(参数列表):
函数体
return 返回值


get_water:函数名(工具名,使用工具的依据)
(money):参数
print()...:函数体(功能实体)
return:函数的返回值
'''


# 函数四部分
'''
1. 函数名:使用该函数的依据, 没有函数名就无法正常使用函数
2. 函数体:完成功能的代码块,没有函数体事都做不了
3. 返回值:功能完成的反馈结果,函数做完事一定要有结果,且要告诉外界
4. 参数:完成功能需要的条件信息,函数内部要使用一些外部数据
'''

# 参数可有可无
# return一定有,但存在方式多种
def fn(a, b):
return

# 参数范畴
# 生产零件: 不需要参数
def make_flag():
print('立个flag')
make_flag()
make_flag()

# 购物:需要参数
def shopping(money, goods):
print('花了%s钱买了个%s' % (money, goods))
shopping(10000, '表')

# 返回值

# 没有写return,默认返回None
def fn():
pass
res = fn()
print(res)

# 主动书写return,返回None
def fn2():
return
res = fn2()
print(res)

def fn1(info):
if info == 123:
return # 主动结束函数,如果不写return,默认只能在函数最后结束函数
print(info)
fn1(123)

# 结束函数且带出一个值
def fn3():
return 1
res = fn3()
print(res)


# 结束函数且带出多个值: 本质就是带出一个元组
def fn3():
# return 1, 2, 3, 4, 5
return (1, 2, 3, 4, 5)
# res = fn3()
# print(res)
a, b, c, d, e = fn3()
print(a, b, c, d, e)



posted @ 2019-04-01 19:10  zhouyuqiang  阅读(287)  评论(0编辑  收藏  举报