python从开始到灭亡
预科
day01
-
-
操作系统: 总管:对硬件和软件的总体调配
-
编程语言:(Python Java C PHP 。。。) 为了让人与电脑进行对话 编程语言有很多种
-
解释器: 把代码转化成机器能认识的指令
day02
git config --global user.name ""校验远程仓库
git config --global user.email ""
git init在当前目录新建一个Git代码库
git add .添加文件夹下所有增删改查操作
git commit -m ""提交本次操作,备注为""
git push -u origin master推送代码到远程仓库
git remote add origin 远程添加码云仓库源码
git pull origin master 远程代码拉到本地
git pull origin master --allow-unrelated-histories 解决拉码失败问题
day03
主要内容
-
markdown常用语法
-
博客园制作
-
思维导图
-
排bug技巧
markdown常用语法
-
用#+空格实现
一级标题
二级标题
。。。。。。。。
六级标题
-
代码块
三个实现python is a ...单行代码,用“``”
-
列表
有序列表
~~~
无序列表
```
-
跟内容
-
跟内容
-
跟内容 ```
-
链接
-
[目标地址名字](目标地址的地址)
通过快捷键:ctrl + k
-
-
键盘快捷键之缩进
-
往前缩进shif+tab
-
往后缩进tab
-
-
图片:
-
md文件传输时图片丢失的两种解决办法
-
保存时,点击左上角的文件,选择导出PDF
-
借助网络上的平台,把文件上传上去,然后用网络地址代替
-
-
-
分割线
-
---实现分割线的效果
+++实现分割线的效果
***实现分割线的效果
-
-
字体样式
-
加粗
-
**加粗** -
倾斜
-
*倾斜* -
加粗倾斜
-
***加粗倾斜*** -
颜色黄绿色
<span style="color:yellowgreen">黄绿色</span> -
字体宋体 黄绿色 黄绿色
<span style = "font -family:宋体">黄绿色</span>
-
思维导图
-
有层级关系
-
从大范围到具体
-
要求:每周至少上交一篇思维导图,上交码云。
编程语言
编译型
C
C++
......
解释型
Python
PHP
......
Python
基础语法
基础数据类型
str
方法&操作
int
bool
list
.....
函数
......
进阶
面向对象
......
-
思维导图制作工具:
-
x-mind
-
常用快捷键:
-
建立子分局
-
建立兄弟分区
-
-
思维导图何时可用,何时不可用。
-
确定的东西,并且有联系,用思维导图帮助我们总结记忆。
-
两个事物之间没有必然联系,不适合用思维导图。
-
-
学会使用思维导图去整理
博客
https://github.com/search?q=%E5%8D%9A%E5%AE%A2%E5%9B%AD%E4%B8%BB%E9%A2%98
好处:走上人生巅峰的捷径,好处非常多
什么样的内容能作为博客发表?
系技术,以你自己的观点发表。
借鉴国外的一些新技术或者新研究
自己的笔记,要求自己的笔记要成体系。
1. 写博客的平台
+ 博客园:学不完的技术,但是这个平台的推广不好,页面比较low。
+ CSDN:推广非常好,广告做的比较好
排bug技巧
-
根据错误类型推算,错误哪里出的原因。
-
百度搜索
-
stackoverflow
-
建议:自己搞一个bug集合,搞得特别好的可以公开展示,加分
码云的日常操作
要求:
-
每日代码&笔记上传码云
-
每日作业通过老师给的issues写作业,并回复老师的issues
-
-
每周至少一次思维导图,并上传码云
-
前期每周一次周末大作业上传码云
-
大笔记每周至少更新一次,上传码云
day01
python的历史
2000年,内存回收机制 2004年,同年目前最流行的web框架Django诞生
2008 python3诞生
2020年不在更新python2.7
python2:
源码不统一,有重复的功能代码
python3:
源码统一,没有重复的功能代码
python是一个什么编程语言
编译型:一次性翻译 (C)
-
优点:运行速度快
-
缺点:翻译时间长
解释型:一行一行翻译(Python)
-
优点:开发效率高(翻译时间短)
-
缺点:运行速度慢
Python是一门动态解释性的强类型定义语言
python的种类
Cpython(官方推荐)
Jython lroPython PyPy(特殊)
变量
变量定义的规则:
-
变量有数字,字母,下划线组成
-
不能以数字开头
-
不能使用python中关键字
-
不能使用中文和拼音
-
区分大小写
-
变量名要具有可描述性
-
推荐写法
-
驼峰体
AgeOfOldboy = 98 -
下划线
age_of_oldboy = 98(官方推荐)
-
常量
-
变量名全部大写就是常量--常量建议不进行修改
-
常量在配置文件中声明使用
注释
#单行注释(当行注释)# #多行注释'''''' """""" 被注释的内容是不会执行的
基础数据类型初识
字符串 --str(用于存储一些数据) 在python中只要是引号引起来的就是字符串 数字 --int 用于计算和比较 在赋值的时候先执行等号右边的内容 python3:除法的时候返回的是小数(浮点数) python2:除法的时候返回的是整数(向下取整) a = "alex" b = "dsb" c = a + b #字符串拼接 print(c) #字符串+:字符串和字符串相加 #字符串*:字符串和数字相乘 布尔值 --bool(用于判断) True 对 --真 False 错 --假 列表 元组 字典 集合
用户交互(输入/输出)
input(提示语句!) --输入
msg = input("请输入您的内容:")
#int("5")---> 5
print(int(msg) + 5)
#type --查看数据类型
#int() --将字符串类型强制转换成整型
#python3中的input获取到的内容都是字符串
#python2中的input获取的内容就是数据本身
print() --输出
流程控制语句
单 if
if -- 如果
if 条件:
缩进 官方推荐4个空格,Tab 空格和tab不能混合使用
money = 10
print("从学校走")
if money >= 10:
print("买个炸鸡")
print("买个啤酒")
print("走啊走")
print("到家了")
if else 二选一
if 条件:
缩进 结果
else:
缩进 结果
print(123)
money = 1000
if 3>2:
print("这是如果执行了")
print
else:
print("这是否则执行了")
print(345)
if elif elif elif 多选一或不选
if 条件:
结果
elif 条件:
结果
elif 条件:
结果
elif 条件:
结果
if 3>2:
print("这是A")
elif 4>3:
print("这是B")
elif 5>3:
print("这是C")
elif 6>3:
print("这是D")
if elif elif else 多个选一个
if 条件:
结果
elif 条件:
结果
elif 条件:
结果
else:
结果
if 3>2:
print("A")
elif 4>3:
print("B")
elif 5>6:
print("C")
else:
print("D")
if if if 多个条件选多个
if 条件:
结果
if 条件:
结果
if 条件:
结果
if 3>2:
print("A")
if 4>2:
print("B")
if 6>3:
print("C")
if 嵌套
if 条件:
if 条件:
结果
sex = "女"
age == 30
if sex == "女":
if age ==30:
print("进来坐一坐")
else:
print("隔壁找太白")
else:
print("滚犊子")
day02
while
while 循环 --死循环
while循环通过条件和break能够终止循环
break -- 必须在循环中使用
break --终止当前循环,并且break下方代码不会执行
continue -- 跳出本次,继续下次循环(伪装成循环体中最后一个代码)
continue -- 必须在循环中使用,并且下方的代码不会被执行
while --关键字
if 条件:
结果
while 条件:
循环体
while True:
print("爱情买卖")
print("痒")
print("年少有为")
print("浮夸")
print("威风堂堂")
print("大悲咒")
print("情锁")
num = 2
while num > 0:
print("爱情买卖")
print("痒")
print("年少有为")
print("浮夸")
print("威风堂堂")
print("大悲咒")
print("情锁")
num = num - 1
(执行两次)
while True:
print("爱情买卖")
break
print(1234)
#break -- 必须在循环中使用
#break -- 终止当前循环,并且break下方代码不会执行
while True:
print("爱情买卖")
print("痒")
continue
print("年少有为")
#continue -- 跳出本次循环,继续下次循环(伪装成循环体中最后一行代码)
使用while输出10 -57 的数字(包含10和57)
num = 10
while num <= 57:
print(num)
num = num + 1
使用while 输出100 - 10 的数字(包含10和100)
num = 100
while num >= 10:
print(num)
num = num -1
flag = True
while flag:
print(123)
flag = False
else:
print(234)
格式化
#%s -- 占字符串的位置(%s数字,字符串都能进行填充) #%d|%i --占数字的位置 #%% 转义 --转换成普通的百分号 #占的位置和填充时必须要一一对应 #填充的时候按照顺序填充
name = input("name:")
age = input("age:")
addr = input("addr:")
phone = input("phone:")
info = """
-------- info--------
姓名:%s
年龄:%s
公司:%s
电话:%s
-------- end --------
"""%(name,int(age),addr,int(phone))
print(info)
msg = "%s的学习进度是2%s"(12,13) print(msg) #占的位置和填充时必须要一一对应 #填充的时候按照顺序填充
name = "日莫"
print(f"{name}的学习进度2%")
python3.6版本及以上才能使用f
msg = f"""--------info--------
姓名:{input('name')}
年龄:{input('age')}
公司:{input('addr')}
电话:{input('phone')}
-------- end --------"""
print(msg)
运算符
-
算数运算符
+ - * / %(取余) **(幂/次方) //(整除/地板除 - 向下取整)
-
比较运算符
> < >= <= == !=
-
赋值运算符
= += 自加 a = 10 a+=1 #a = a+1 print(a) -=自减 *=自乘 a = 10 a *= 2# a= a*2 print(a) /= //= **= %=
4.逻辑运算符
数字非零的都是真 and 与 and运算都为真才是真,有一个为假就是假。 and运算都为真的时候选择and后边的内容。 and运算都为假的时候选择and前面的内容。 or 或 or运算只要有一个真就是真 or运算都为真的时候选择or前面的内容 or运算都为假的时候选择or后面的内容 not 非 -- 不是 优先级:() > not > and >or
5.成员运算符
in 在
not in 不在
6.编码初识
ascii 256
1字节
不支持中文
gbk(国标)
英文 1字节
中文 2字节
万国码 unicode
中文和英文4个字节
1字节 == 8位
utf-8 最流行的编码集(密码本)
英文 1
欧洲 2
亚洲 3
win - 编码集gbk
linux - 编码utf-8
mac - 编码 utf-8
ascii码:
不支持中文
用1个字节
gbk(国标):
英文用1个字节
中文两个字节
unicode(万国码)
英文4个字节
中文4个字节
utf-8
英文1个字节
欧洲2个字节
亚洲3个字节
单位转换:
1字节 == 8位 <==> 1B ==8b ******* 1B = 8b 1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB #最常用的就是TB 1PB = 1024TB 1EB = 1024PB
day02 总结
1.while 循环
while 条件 :
循环体
-
改变条件
-
break
break:终止当前循环
continue:跳出本次循环,继续下次循环(伪装成循环体中最后一行)
-
while 条件:
循环体
else:
结果
#当while循环体中出现了break就不会再执行else
2.格式化
%s - 字符串
%d - 数字
%% - 转义
%(按照位置顺序填充,一 一对应)
3.运算符
算法
比较
赋值
逻辑 and or not
成员
4.编码初识
win - 编码集gbk
linux - 编码utf-8
mac - 编码 utf-8
ascii码:
不支持中文
用1个字节
gbk(国标):
英文用1个字节
中文两个字节
unicode(万国码)
英文4个字节
中文4个字节
utf-8
英文1个字节
欧洲2个字节
亚洲3个字节
1字节 = 8位
1B(Bytes) == 8b(bit)
day03
int --整型
python3:全部是整型
python2:整型,长整型long
用于计算和比较
123 ---10进制
print(bin(30)) 10进制转2进制 2进制转10进制
布尔值
转换
int ,str ,bool
a = bool(-1)
print(a)
a = int(True) print(a) a = int(False) print(a)
#整形中只要是非零的就是True
布尔值 0 --False 1--True
字符串中只要没有内容就是False
字符串详解
str --字符串:
python中只要是引号引起来的就是字符串
#字符串:用于数据存储,存储少量数据
a = "meet" #字符串中每一个字母或者字符都称为元素 #"meet" # 0123 #"m e e t" #-4-3-2-1 #索引(下标) :从左向右排 #索引的时候不能超出索引最大值
切片
print(a[5:11])#[索引值][起始位置(包含):终止位置(不包含)] #切片的时候可以超出索引值 print(a[21:]) [21(起始位置):(默认到最后)] print(a[:])[(默认从最开始):(默认打最后)] print(a[-6:-2:1]) 步长决定查找的方向
字符串的方法
字符串是不可变数据类型,字符串是有序的
name = "alex" a = name.upper()#全部大写 a= name.lower()#全部小写 print(name)
name = "alex"
print(name.startswith('a',2,3))#以什么开头--返回的是布尔值
print(name.endswith('x',0,2))#以什么结尾--返回的是布尔值
name = "alexwusirtaibai"
print(name.count("i"))#统计,计数
user = input("username:")
pwd = input("password:")
if user == 'alex' and pwd == "alexdsb":
print("登陆成功!")
else:
print("账号或密码错误!")
pwd = " alexdsb "
a = pwd.strip()#脱 默认脱(脱头尾两端的空格,换行符\n,制表符\t)
print(a)
pwd = "alexasdsba"
a = pwd.strip("a1")#去除头尾两端指定的内容
print(a)
name = "alex wusir"
name.split() #分割(默认空格,换行符\n,制表符\t)
print(a) #['alex','wusi']
name.split("_",2)
name = "alex,wusir,taibai"
name.replace(",",".") #替换
name.replace(",",".",1)#全部替换
print(a)
字符串格式化
name = "{}今年:{}".format("宝元",18)#按照位置顺序进行填充
name = "{1}今年:{0}".format("宝元",18)#按照索引进行填充
name = "{name}今年:{age}".format(name="宝元",age=18)#按照名字进行填充
print(name)
%s f format
is 系列 是进行判断 返回的是布尔值
msg ="123"
print(msg.isdigit())#判断字符串中的内容是不是全是数字(阿拉伯数字)
print(msg.isdecimal())#判断是不是十进制数
print(msg.isalnum())#判断是不是数字,字母,中文
print(msg.isalpha())#判断是不是字母,中文
总结:
upper 全部大写
lower 全部小写
startswith
endswith
count
strip
replace
format
isdecimal()
isalnum()
isalpha()
msg = "今天是个好日子"
print(msg)
公用的方法:len
print(len(msg))
#使用while循环打印字符串中每个元素
i = 0
while i < len(msg):#while 0 < 16:
print(msg[i])
i += 1
for循环
msg = "今天是个好日子"
print(msg)
公用的方法:len
print(len(msg))
#使用while循环打印字符串中每个元素
i = 0
while i < len(msg):#while 0 < 16:
print(msg[i])
i += 1
for i in msg:
print(i)
for 关键字
i 变量名(可以任意修改)
in 关键字
msg 可迭代对象
可迭代对象:python数据类型中除了int,bool其余都可以迭代
msg = "今天是个好日子"
for a in msg:
pass #过 占位
#print(a)
print(a)
for i in "abc":
pass #占一行的位置
print(i)
for i in "abc":
... # 和pass功能一样
print(12)
for循环在循环的时候就已经进行了赋值
day03总结
# 1.整型及布尔值转换
# Python3: 都是整型
# Python2: 整型, 长整型
# 10 - 2 bin()
# 2 - 10 int("1110",2)
# 数字:只要不为零全都是True
# 字符串:只要有内容就是True
# 2.索引,切片,步长
# 索引:
# 从左向右
# 从右向左
# 索引不能超出索引最大值
#
# 切片:
# [起始位置:终止位置]
# 顾头不顾尾
# 终止位置可以超出
# [:] [从头到尾]
# 步长:
# [起始位置:终止位置:步长]
# 步长决定查找方向
# 决定查找时迈的步子
# [::-1] 将字符串进行反转
切片和步长 的时候可以超出界限
切片的时候返回的结果,就是原数据本身
# 3.字符串方法
# upper *****
# lower ****
# startswith ***
# endswith ***
# count ****
# strip ******
# split ******
# replace ******
# format ***
# isdecimal() ***
# isalnum() ***
# isalpha() ***
# 4.for循环
# for 关键字
# i 变量(可以任意修改)
# in 关键字
# 可跌代对象(int,bool)除外
# for i in "abc":
# pass # 占一行的位置 pass下方的代码会进行执行
# print(i)
# for 循环在循环的时候就已经进行了赋值
# for i in "abc":
# ... # ...和pass功能一样
for i in "abc":
print(i)
day04
今日内容
-
列表
-
元组
-
range
列表
a = "meet" #在字符串中只要是占一个位置的就是一个元素 lst = [1,2,3,4] #列表中只要用逗号隔开的就是一个元素
啥是列表?
-
数据类型之一,存储数据,大量的,存储不同类型的数据
定义一个列表
lst = [1,2,"alex,True",["钥匙","门禁卡"],["银行卡"]] print(lst)
别的语言成为数组的就是python中的列表
列表 -- 容器
-
列表是一种有序的容器 支持索引
-
列表是一种可变数据类型 原地修改
lst = [1,2,3,4]
列表的增加
lst.append(13) #追加 在最末尾的地方进行添加
lst.insert() #插入 尽量少使用
lst.extend() #迭代添加
lst.extend("ALEX")
print(lst)
for i in [1,2,3,4]:
lst.append(i)
print(lst)
列表的删除
lst = [1,2,3,4,3] lst.remove(3) #通过元素的名字进行删除 只能删除第一个,从左向右删除 print(lst) lst.pop() # 弹出 默认删除最后一个,并且具有返回值,返回的值是弹出的内容。 通过索引进行删除 print(lst) lst = [1,2,'3',4,3] print(repr(lst.pop(2))) #repr()查看当前数据的原生态 print(lst) lst.clear() #清空 print(lst) del lst[4]#通过索引删除 del lst[2:5]#通过切片删除 del lst[1:5:2]#通过步长删除 print(lst)
列表的修改
lst = [1,2,3,4,5] lst[2] = 80 #通过索引进行修改 lst[1:3] = "alexdsb" #通过切片进行修改,默认步长为1,可以修改的内容必须是可迭代的对象,修改的内容可多可少 print(lst) lst[1:5:2] = 100,100 #步长不为1的时候必须一一对应
列表的查
-
for 循环
-
索引
列表的嵌套
lst = [1,2,[3,4,5["alex[]",True,[[1,2]],90],"wusir"],"taibai"] lst1 = lst[2] lst2 = lst1[3] print(lst2[0]) str_1 = lst[0] print(str_1[-1]) print(lst[2][3][0][-1])
元组
python数据类型之一
tuple
有序
不可变
定义方式:
tu = (1,2,3)
lst = [1,2,3]
tu = (1,2,3)
for i in tu:
print(i)
元组支持查询
-
元组就是一个不可变的列表
元组的方法
-
统计
-
获取索引
tu = (1,2,3,4,5,1,2,1) print(tu.count(1)) print(tu.index(4)) #通过元素查询索引
元组的用途
tu = (1,2,3) tu[2] = 80 print(tu)
配置文件中
元组的嵌套
tu = (1,2,3,4,(5,6,7,8,("alex","wusir",[1,23,4])))
print(tu[4][4])
range(范围)
print(range(1,10)) #python3中range是自己range本身
print range(1,10) #python2中打印range获取的是一个列表,列表的元素是1-9
range(1,10)#[起始位置:终止位置]顾头不顾尾
range(1,10,2)#[起始位置:终止位置:步长]默认为1
range(10) #10代表的是终止位置,起始位置默认为0
range的诞生是为了解决不能循环数字
range是一个可迭代对象
for i in range(10):
print(i)
day05
-
字典
-
python的数据类型之一
-
字典 -- dict
-
定义: dic = {"key":value} --键值对
字典的作用:
-
存储数据,大大量,将数据和数据起到关联作用
dic = {"10":"苹果手机","11":"苹果手机"}
-
所有的操作都是通过键
dic = {"10":"苹果手机","11":"苹果手机","15":"小米手机","True","华为手机",(1,):"oppo手机",[1,2]:"诺基亚"} print(dic) -
所有的操作都是通过键
-
键:必须是不可变的数据类型(可哈希),且唯一
-
值:任意(不可哈希)
字典是可变数据类型,无序的
-
lst = ["日魔","炮手","豹哥"] lst1 = ["看动漫","飞机","贴膏药"] dic = { "日魔":"看动漫", "炮手":"飞机", "豹哥":"贴膏药", "宝元":"保健", "alex":"吹牛逼" } dic.get("日魔")
字典的增:
-
暴力添加:
dic["日阳"] = "曹洋" #字典的添加,添加的是一个键值对 dic["小妹"] = ["听歌","唱歌",吃","烤馕","大盘鸡","葡萄干"] print(dic)
-
有则不添加,无则添加
dic.setdefault("元宝",["唱","跳","篮球","喝酒"])
print(dic)
setdefault 分为两步:
-
先查看键是否在字典
-
不存在的时候进行添加
字典的删除
dic = {
"日魔":"看动漫",
"炮手":"飞机",
"豹哥":"贴膏药",
"宝元":"保健",
"alex":"吹牛逼"
}
dic.get("日魔")
dic.pop("宝元")
print(dic)
print(dic.pop("宝元"))#pop删除通过字典中的键进行删除 返回的也是被删除的值
dic.clear() #清空
print(dic)
del dic #删除的是整个容器
print(dic)
del dic["alex"] #通过键进行删除
print(dic)
字典中没有remove
字典的改:
dic = {
"日魔":"看动漫",
"炮手":"飞机",
"豹哥":"贴膏药",
"宝元":"保健",
"alex":"吹牛逼"
}
dic["alex"] = "dsb" #有则覆盖,没有添加
print(dic)
dic.update({"alex":"上过北大","wusir":"干过前端"})
print(dic)
字典的查
-
dic = { "日魔":"看动漫", "炮手":"飞机", "豹哥":"贴膏药", "宝元":"保健", "alex":"吹牛逼" } dic.get("alex") #查询不到返回None print(dic.get("元宝","找不到啊"))#查找不到的时候返回自己制定的内容 dic.setdefault("alex") #查询不到返回None dic["alex"] #查询不到就报错 -
for i in dic:#查看所有的键 print(i) for i in dic: #查看所有的值 print(dic.get(i)) -
print(dic.keys()) #获取到的是一个高仿列表 print(dic.values()) #获取到的是一个高仿列表 for i in dic.values():#高仿列表支持迭代 print(i) print(dic.values()[3]) 高仿列表不支持索引 -
lst = [] for i in dic: lst.append(i,dic[i]) print(lst) print(list(dic.items())) for i in dic.items(): print(i) for i in dic.items(): print(i[0],i[1]) -
解构: 面试题 a = 10 b = 20 a,b = b,a print(a) print(b)
-
a,b = 10,20 print(a) print(b)
解构
lst = [1,2,3,4,5,6,7,8] print(lst[:2].append(lst[4]))#两个都是列表的时候才能够相加 print(lst1) print(lst[:2] + list(str(lst[4])))
lst = [1,2,3,4,5,6,7,8] a,b,_1,_,c,*aa = lst # *是万能接收 print(a) print(b) print(c)
for i in dic.items():
print(i)
a,b = i #自己写的解构
print(a)
print(b)
for a,b in dic.items():
print(a)
print(b)
字典的嵌套
dic = {
101:{1:{"日魔":"对象"},
2:{"隔壁老王":"王炸"},
3:{"乔碧萝":("日魔","炮手","宝元")},
},
102:{1:{"汪峰":{"国际章":["小苹果","大鸭梨"]}},
2:{"邓紫棋":["泡沫","信仰","天堂","光年之外"]},
3:{"腾格尔":["隐形的翅膀","卡路里","日不落"]}
},
103:{1:{"蔡徐坤":{"唱":["鸡你太美"],"跳":["钢管舞"],"rap":["大碗面"],"篮球":("NBA形象大使")}},
2:{"JJ":{"行走的CD":["江南","曹操","背对背拥抱","小酒窝","不潮不花钱"]}},
3:{"Jay":{"周董":["菊花台","双节棍","霍元甲"]}}},
201:{
1:{"韦小宝":{"双儿":"刺客","建宁":{"公主":{"吴三桂":"熊"}},"龙儿":{"教主老婆":"教主",}}}
}
}
day06
今日内容
-
小数据池 --
-
深浅拷贝
-
集合
小数据池
-
is id
-
判断两个值是否相等
is --是
小数据池 --int, str,bool
int : -5~256
代码块 :
-
一个py文件 ,一个函数 ,一个模块 ,终端中每一行都是代码块
-
int ,str ,bool
-
int:范围( -5 ~ 正无穷)
-
a = 1000 b = 1000 print(id(a),id(b)) print(a is b)
-
-
str
-
a = "asdfgh12345" b = "asdfgh12345" print(a == b) print(a is b)
-
字符串:
-
定义字符串的时候可以是任意的
-
字符串(字母,数字)进行乘法时,总长度不超过20
-
特殊符号(中文,符号)进行乘法的时候只能乘以 0 或 1
-
-
-
bool
-
True
-
False
-
is 判断的是两边的内存地址是否相同
== 判断两边的值是否相同
-
小数据池,代码块同在的情况下先执行代码块
-
str:
-
字母,数字长度任意符合驻留机制
-
字符串进行乘法的时候总长度不能超过20
-
特殊符号进行乘法的时候只能乘0
-
驻留机制
-
节省内存空间,提升效率(减少了开辟空间和销毁空间的耗时)
深浅拷贝
-
以后尽量避免
-
面试必问
赋值
a = [1,2,3,4] b = a #print(id(a),id(b)) #print(a is b) #a.append(5) #print(b) a.append([1,2,3]) print(b)
浅拷贝
a = [1,2,3,4,5] b = a.copy() print(a) print(b) print(a == b) a = [1,2,3,[4,5]] b = a[:] #切片 --浅拷贝 print(id(a)) print(id(b)) a = [1,2,3,[4,5]] b = a[:] a[-1].append(6) print(b)
浅拷贝:只拷贝第一层元素的地址,只有修改拷贝的数据第一层(不可变类型)的时候源数据不受影响,给可变数据进行添加的时候源数据会影响
= 是修改 .append是添加 可变数据类型能够修改和添加,不可变数据类型只能修改
深拷贝
import copy # 导入copy模块
import copy a = [1,2,3,[4,5],6] b = copy.deepcopy(a) print(id(a[-2])) print(id(b[-2])) 深拷贝:不可变数据类型内存地址共用,可变数据类型新开辟一个空间 不管嵌套多深
集合
-
python中数据类型之一
-
集合 -- set
-
定义: s = {1,2,3,4}
-
集合就是一个没有值的字典 唯一,不可变 无序,可变 集合天然去重
面试题:
lst = [1,233,1,1,2,31,231,22,12,3,14,12,3] print(list(set(list)))
增:
s = {} #空字典
s1 = set() #空集合
print(type(s))
print(type(s1))
s = set()
s.add("alex")
s.update("wusir")#迭代添加
print(s)
print(set("wusir")) #迭代添加
删
s = {1,23,5,4}
s.remove(4) #通过元素删除
print(s)
s.clera() #清空
s.pop() #随机删除(最小的)
print(s)
改
s = {1,2,3,4,5}
先删后改
查
for 循环
其他操作
差集--
s = {1,23,9,4,5,7}
s1 ={1,2,3,4,5}
print(s - s1)
交集--
print(s & s1)
并集-- | 管道符
print(s | s1)
反交集--
print(s ^ s1)
子集 返回的一个布尔值
print(s > s1)
父集(超集)
print(s < s1)
print(frozenset({1,23,4,5}))# 冻结集合
今天是个好日子 s = "今天是个好日子" print(s.encode("utf-8")) #编码
a = "meet" s1 = a.encode("utf-8") print("meet")
print(b"meet")#只有字母才能这么搞 s2 = s1.decode("utf-8")#解码 print(s2)
必会: python3:默认编码unicode python2:默认编码ascii python2不支持中文
重要: encode()#编码 decode()#解码
用什么编码就要用什么解码 网络传输一定是字节
day07
-
基础数据类型补充
-
以后会遇到的坑
-
二次编码
基础数据类型补充
-
str(字符串)
a = "alex wusir" print(a.capitalize()) #首字母大写 print(a.title()) #每个单词首字大写 print(a.swapcase())#大小写转换 print(a.center(20,"*")) #居中-填充 print(a.find()) #查找 元素查找索引,查找不到时返回-1 print(a.index("c")) 查找 通过元素查找索引,查找不到时就报错 print(a.join("_")) print("_".join(["1","2","4"]))#拼接,将列表转换成字符串 str+str str*5 字符串进行加操作,乘操作都是开品新的空间 -
list(列表)
列表的定义 print(list('123445')) 列表的方法: lst = [1,23,45,7,8,9] print(lst.index(4)) #通过元素查找索引 lst.sort()#排序 默认时升序 lst.sort(reverse = True) #降序 print(lst) lst.sort lst.reverse() #反转 print(lst) print(lst[::-1])# 反转 lst = [1,23,4,5,7,8,9] lst1 = lst[::-1] print(lst) #不修改源数据进行反转 print(lst1) 加 lst = [1,2,3,4] lst + [1,2,3] print(lst) 乘 lst = [1,2,3] * 5 print(lst) 面试题 lst = [1,[]] * 5 print(lst) lst[1].append(6) print(lst) 列表在进行乘法的时候,元素是共用的 -
tuple(元组)
面试题 tu = (1) tu1 = ("alex") tu2 = (1,)#元组 加 tu = (12,3,4) + (4,5,3,4) print(tu) 乘 tu = (1,[]) *3 print(tu) tu[-1].append(10) print(tu) -
dict (字典)
dic = {"key":1,"key2":2,"key3":1}
dic.popitem() #随机删除 python3.6版删除最后一个 popitem返回的是被删除的键值对
print(dic)
面试题:
dic = {}
print(dic.fromkeys("abc",[]))#批量创建键值对"abc":[],"b":[],"c":[]
dic = {}
dic = dic.fromkeys("abc",[])
print(dic)
dic["a"].append(10)
print(dic)
dic["b"] =11
dic["a"].append(10)
print(dic)
fromkeys 第一个参数必须是可迭代对象,会将可迭代对象进行迭代,成为字典的键。第二个参数是值(这个值是共用的) fromkeys 共用的值是可变数据类型就会有坑,不可变数据类型就没事
基础数据类型总结
-
可变:
-
list
-
dict
-
set
-
-
不可变
-
int
-
str
-
bool
-
tuple
-
-
有序
-
list
-
tuple
-
str
-
-
无序
-
dict
-
set(集合)
-
取值方式
-
索引
-
list
-
tuple
-
str
-
-
键
-
dict
-
-
直接
-
int
-
bool
-
set
-
数据类型转换
str --int
int --str
str --bool
bool --str
int --bool
bool --int
list --tuple
lst = [1,23,5,4] print(tuple(lst))
tuple -- list
tu = (1,23,5,4) print(list(tu))
list --set
lst = [1,23,12,31,23] print(set(lst))
tuple -- set
tu = (1,2,3,4,5) print(set(tu))
重要:
list -- str
lst = ["1","2","3"]
print("".join(lst))
str --list
s = "alex wusir 太白" print(s.split())
目前 字典转换,自己实现方法
重点
-
find
-
join
-
列表乘法
-
元组(1,)
-
元组乘法
-
list --str
-
str --list
死循环
lst = [1,2,3]
for i in lst:
lst.append(4)
print(lst)
lst = [11,22,33,44]
for i in lst:
lst.remove()
print(lst)
for i in lst:
lst.pop()
print(lst)
for i in range(len(lst)):
del lst[-1]
print(lst)
lst = [11,22,33,44]
lst1 = lst[:]
for i in lst1:
lst.remove(i)
print(lst)
使用for循环清空列表元素内容,1.从后向前删除,2.创建一个新的容器,循环新的容器删除旧的容器
面试题
lst = [1,[2]]
lst[1] = lst
print(lst)
答案:[1,[...]]
字典和集合
dic = {"key":1,"key1":2}
for i in dic:
if i =="key1":
dic.pop(i)
else:
print("没有这个键")
print(dic)
字典和集合在遍历(循环)时不能修改原来的大小(字典的长度),可以进行修改值
s = {1,2,3,4,5,6}
for i in s:
s.pop()
print(s)
二次编码
编码
-
ascii码:
-
支持:英文,数字,符号 1字节
-
不支持:中文
-
-
GBK(国标)
-
支持:英文,数字,,符号 ---ascii 1字节
-
支持:中文 2字节
-
-
Unicode(万国码):
-
支持:英文,数字,,符号 4字节
-
支持:欧洲 4字节
-
支持:亚洲 4字节
-
-
utf-8
-
支持:英文,数字,,符号 1字节
-
支持:欧洲 2字节
-
支持:亚洲 3字节
-
000001101 = 1字节
字节:存储和传输
今天是个好日子
s = "今天是个好日子"
print(s.encode("utf-8")) #编码
a = "meet"
s1 = a.encode("utf-8")
print("meet")
print(b"meet")#只有字母才能这么搞
s2 = s1.decode("utf-8")#解码
print(s2)
必会:
python3:默认编码unicode
python2:默认编码ascii
python2不支持中文
重要:
encode()#编码
decode()#解码
用什么编码就要用什么解码
网络传输一定是字节
day08
文件操作
-
找到文件位置
-
双击打开
-
进行一些操作 # r --read(读) w --write(写) a --追加
-
rb--(读字节)wb ab r+ w+ a+
-
-
关闭文件
open() #通过open通过python操作系统进行打开文件
file 文件的位置
encoding 文件的编码
mode默认不写就是r
f文件句柄
读操作
f = open("E:\2345下载\1\a\111",mode = "r",encoding = "utf-8")
print(f.read()) #全部读取
print(f.read(11))#按照字符读取
print(f.readline())#默认尾部有一个\n
print(f.readline().strip)#将\n去除
print(f.readlines())#一行一行读取,全部存储仔列表中
路径转义:
1."D:\\Python_s25\\day088\\t1.txt" 2.r "D:\Python_s25\day088\t1.txt"--推荐使用
路径:
1.绝对路径:从磁盘(C盘)开始查找 2.相对路径:相对于某个文件进行查找
rb
字节操作,不能指定encoding(编码) open print(f.read())#全部读取 print(f.read(3))#按照字节读取 print(f.readline())#按照行进行读取
r和rb的区别:
1.r需要指定encoding,rb不需要 2.r模式中的read(3)按照字符读取,rb模式中的read(3)按照字节读取
read 和readlines 如果文件较大时,会出现内存溢出
解决方案:
面试题:
当文件较大时,使用for循环进行读取
f = open('t1',mode="r",encoding="utf-8")
for i in f:
print(i.strip())
写操作:
w操作--清空写
-
先清空文件(打开文件的时候清空)
-
写入内容
当模式为w和a时,有文件就使用当前文件,没有文件就创建一个文件
ff = open("a1",mode="w",encoding="utf-8")
ff.write("123")#写的内容必须是字符串
ff.write("我是一个字符串串")
ff.write("111\n")
wb --清空写(写字节)
f = open('timg.jpg',mode="rb")
f1 = open("g1.jpg",mode="wb")
我 = f.read()
f1.write(content)
a --追加写(文本)
open("a1",mode="a",encoding="utf-8")
f.write("你好啊")
加操作
r+ 读写
f = open("b1",mode="r+",encoding="utf-8")
f.write("今天是周一")
print(f.read())
正确的操作:
f = open("b1",mode="r+",encoding="utf-8")
print(f.read())
f.write("今天是周一")
w+ 写读(有点用)
f= open("b1",mode="w+",encoding="utf-8")
f.write("今天是周一")
f.seek(0)#移动光标
print(f.read())
a+ 追加读 #坑
f= open("b1",mode="a+",encoding="utf-8")
f.write("今天是周一")
f.seek(0)#移动光标
f.write("啊啊啊啊啊")
print(f.read())
其他操作:
seek()移动光标
f = open("a1","r",encoding="utf-8")
print(f.read(5))
f.seek(0,0)#移动光标到文件的头部
f.seek(0,1)#移动光标到当前位置
f.seek(0,2)#移动光标到文件末尾
f.seek(5) #光标是按照字节移动
print(f.read())
查看光标:
f = open("a1","r",encoding="gbk")
print(f.read(3))
print(f.tell())#按照字节进行计算
修改文件
import os #操作系统交互的接口
f = open('a1',"r",encoding="utf-8")
f1 = open('a2',"w",encoding="utf-8")
for i in f:
i.replace("天","日")
f1.write(i)
f.close()
f1.close()
os.remove("a1")#删除不能找回
os.rename("a2","a1")
os.rename("a2","a3")
os.rename("a1","a2")
import os #操作系统交互的接口
f = open('a1',"r",encoding="utf-8")
f1 = open('a2',"w",encoding="utf-8")
i = f1.read().replace("天","日")#将文件中全部内容读取 容易导致内存溢出
f1.write(i)
f.close()
f1.close()
os.rename("a2","a3")
os.rename("a1","a2")
with open('a3',"r",encoding="utf-8")as f , open('a2',"r",encoding="utf-8") as f1:
print(f.read())
print(f1.read())
#1.自动关闭文件
#2.同一时间操作多个文件
文件操作的目的:持久化:永久存储
(数据库之前---文件操作就是代替数据库)
day09
-
函数
-
定义函数
-
调用函数
-
函数的返回值
-
函数的参数
-
函数初识
-
什么是函数?
-
将某个功能封装到一个空间中就是一个函数
-
减少重复代码
-
s = "alexdsb" n = 0 for i in s: n += 1 print(n) -
tu = (1,2,3,4,5,6,7) n = 0 for i in tu: n +=1 print(n)
-
定义函数:
def python中关键字
len 函数名 --变量名一摸一样
()必须要写的 格式规定
: 语句结束
def len():
函数体
def my_len():
n = 0
for i in dic:
n +=1
print(n)
my_len()调用
函数的调用
函数名+()就是在调用函数
def yue():
print("掏出手机")
print("打开手机")
print("摇一摇")
print("聊一聊")
print("约吗?")
print("....")
yue()
函数的返回值:
def yue():
print("打开手机")
print("打开微信")
print("打开附近的人")
print("聊一聊")
print("见一见")
print("。。。。")
return ["小萝莉","人妖","老奶奶","蔡徐坤"] return后没有规则都能扔
#yue()
girl = yue()
print(girl)
#函数的返回值,返回给函数的调用者
函数名+():
1.启动函数
2.接受返回值
return 值 ==返回值
return:
1.可以返回任意类型数据
2.return返回多个内容手机元组的形式
3.return下方的代码不执行,并且会终止当前这个函数
4.return不写或写了return后面不写值都返回None
5.return不能终止循环
def func():
msg = input("请输入内容:")
if msg == "1":
while True:
print("111")
return 3
else:
for i in range(5):
print(i)
func()
函数的参数
位置参数:一一对应
默认参数:函数定义的时括号中写好的就是默认参数 不进行传参使用默认参数,进行传参时使用传递的参数
形参:在函数的定义阶段
-
位置参数:一一对应 按照顺序进行传递 变量名不能重复 传递的参数可以不使用,但必须有
-
默认参数 :定义阶段提前赋值,如果没有进行传参,就是用它的默认参数
-
混合参数 优先级:位置参数>默认参数
实参:在函数的调用阶段
位置参数:一一对应
关键字参数:按照名字进行传参
混合参数:位置参数和关键字参数混合使用
位置参数 >默认参数(关键字参数)
注意点:参数名字不能重复,优先级不能放反
参数传递后,可以不适用
位置参数是一一对应
return不能终止循环
-
形参:函数定义阶段括号中的参数叫做形参
-
实参:在函数调用阶段括号中的参数叫做实参
-
传参:将实参传递给形参的过程叫做传参
a = 1
b = 2
def func():
return a + b
print(1)
print(func())
def yue(app):#形参
#函数帮咱们做了一个赋值 app = "默默"
print("掏出手机")
print("打开"+app)
print("摇一摇")
print("聊一聊")
print("约吗?")
print("....")
yue("默默")#实参
三元运算(三目运算)
def func(a,b):
return a if a > b else b
print(func(6,9))
条件成立的结果 条件 条件不成的结果
条件成立的结果(a) 条件 (if a >b else) 条件不成立的结果(b)
三元运算中只能是 if else
函数是一种编码思维
enumerate 枚举 默认是从0开始数 第一个参数:可迭代对象 第二个参数:数数的起始值
day10
今日内容:
函数的进阶:
-
动态参数
-
函数的注释
-
名称空间
-
函数嵌套
-
global nonlocal
动态位置参数
-
在参数位置用*表示接受任意参数
-
动态接收参数的时候要注意: 动态参数必须在位置参数后面
-
def eat(*args):#定义阶段 * 聚合()
print(args)#tuple
print(*args) #函数体中的 * 打散(解包)
#a,b,*c = args
#print(a,b,c)
eat("麻辣烫","大烧饼","大煎饼","大腰子","韭菜","羊蝎子","黄焖鸡")
def eat(a,b,*c): #位置参数>动态位置参数>默认参数
print(a)
print(b)
print(c)
eat("面条","米饭","馒头","大饼")
*args 大家伙都用的名字,可以进行修改但是不建议修改
**kwargs 大家伙都用的名字,可以进行修改但是不建议修改
-
函数的定义阶段 * 和 **都是聚合 函数体中 * 就是打散,*args 字符串 *kwargs 字典的键
动态默认参数
def eat(a,b,*args,**kwargs):#位置参数>动态位置参数>默认参数>动态默认参数
print(a)
print(b)
print(args) #tuple
print(kwargs) #dict
eat("面条","米饭",a1 = 1,b1=2)
def eat(*args,**kwargs):#(万能传参)
print(args)#tuple
print(kwargs)#字典
lst = [1,2,3,4,5,6]
dic = {'key1':1,'key2':3}
#eat(lst,dic)
#a,b,c,d,e = lst
#k1,k2 = dic
#eat(a,b,c,d,e,k1=dic[k1],k2=dic[k2])
eat(*lst,**dic) #eat(1,2,3,4,5,6)
应用场景:
数据库
动态参数总结
*args (聚合位置参数)大家伙都用的名字,可以进行修改但是不建议修改
**kwargs(聚合关键字参数) 大家伙都用的名字,可以进行修改但是不建议修改
函数的定义阶段 * 和 **都是聚合 函数体中 * 就是打散,*args 将元组中的元组进行打散 *kwargs 将字典的键获取
-
形参
-
位置参数
-
动态位置参数:先执行位置参数,位置参数接受后额外的参数动态位置参数进行接受 获取的是一个元组
-
默认参数:
-
动态默认参数(默认):先执行默认参数,默认参数接受后额外的默认参数动他默认参数进行接受,获取的是一个字典
-
-
实参:
-
* 打散 ** 实参时能够使用
-
函数的注释
def my_sum(a: int, b: int):
"""
求和
:param a:int
:param b: int
:return: int
"""
return a + b
print(my_sum(8, 6))
print(my_sum.__doc__) #查看函数的注释
print(a._doc_)#查看函数的名字
名称空间
-
内置空间:Python解释器自带的空间
-
全局空间:py文件中顶格写的就是全局空间
-
局部空间:函数体中就是局部空间
-
加载顺序:
-
内置空间
-
全局空间
-
局部空间
-
-
取值顺序:
-
局部空间
-
全局空间
-
内置空间
-
-
作用域:
-
全局作用域 :全局 + 内置
-
局部作用域 : 局部
-
-
函数的嵌套
不管在什么位置,只要是函数名()就是在调用一个函数
混合嵌套:
def fun1():
print(111)
def fun2():
print(222)
fun1()
fun2()
print(111)
def fun2():
print(222)
def fun3():
print(666)
print(444)
fun3()
print(888)
print(33)
fun2()
print(555)
函数和函数之前是独立的
global nonlocal
global :只修改全局
-
在函数内部修改全局的变量,如果全局中不存在就创建一个变量
-
nonlocal:只修改局部,修改离弄nonlocal最近的一层,上一层没有继续向上上层查找,只限在局部
a = 10
def func():
global a
a = a + 5
print(a)
print(a)
func()
今日总结
-
函数进阶:
-
动态参数
-
*args 动态位置参数
-
**kwargs 动态默认参数
-
位置>动态位置>默认>动态默认
-
定义的时候是*是聚合
-
函数体和实参是打散
-
*args,**kwargs
-
-
函数的注释
函数名._doc_ 查看注释内容 函数名._name_ 查看函数名称
-
名称空间
-
加载
-
内置空间>全局空间>局部空间
-
-
取值
-
局部空间>全局空间>内置空间(就地原则)
-
-
作用域:
-
全局作用域:全局+内置
-
局部作用域:局部
-
-
-
函数的嵌套
-
不管在什么位置,只要是函数名()就是在调用函数
-
-
global nonlocal
-
global :只修改全局
nonlocal:只修改局部,修改离弄nonlocal最近的一层,上一层没有继续向上上层查找,只限在局部
-
-
day11
今日内容
-
函数名的第一类对象及使用
-
f-strings 格式化
-
迭代器
-
python三大器
-
迭代器
-
生成器
-
装饰器 ---装饰器进阶
-
-
函数名的第一类对象及使用
-
当做值,赋值给变量
def func(): print(1) print(func) #查看的函数的内存地址 a = func print(a) a() -
可以当做容器中的元素
lst=[] dic={} def func(): print(1) def foo(): print(2) lst = [func,foo] print(lst) -
函数名可以当做函数的参数
def foo(a): a() print(111) def func(): print(222) def f1(): print(333) foo(f1) func() -
函数名可以当做函数的返回值
def func(): def foo(): print(111) return foo func()() #foo()
函数名的第一类对象的使用方式如下:
-
可以当做值,赋值给变量
-
可以当作容器中的元素
-
可以当做函数的参数
-
可以当做函数的返回值
f-strings
name = input("name:")
age = input("age:")
f"{变量名}"
F"{变量名}"
f"""{变量名}"""
f"{input()}"
f"{3 if 3>2 else 2}"
lst = [1,2,3,4,5]
f"{lst[4]}"
f"{lst[-1]}"
迭代器
可迭代对象:
-
list
-
tuple
-
srt
-
set
-
dict
-
取值方式只能直接看
-
只要具有__iter__()方法就是一个可迭代对象
lst = [1,2,3,4,5]
for i in lst:
print(i)
迭代 器 :工具
具有__iter__()和__next__()两个方法才是迭代器
lst = [1,2,3,4,5]
l = lst.__iter__()#将可迭代对象转换成迭代器
l.__iter__ #迭代器指定__iter__()还是原来的迭代器
print(l.__next__())
for循环的本质:重要
while True:
try:#监听
print(l.__next__())
except StopIteration:#报错退出
break
lst = [1,2,3,4,5]
l = iter(lst)
# iter()和__iter__()是一样的 推荐使用iter()
python3:
iter()和__iter__()都有
next()和__next__()都有
python2:
iter()
next()
迭代器的优点:
-
惰性机制 ---节省空间
迭代器的缺点:
-
不能直接查看值,迭代器查看到的是一个迭代器的内存地址
-
一次性,用完就没有了
-
不能逆行(后退)
空间换时间:容器存储大量的元素,取值时间短,但是容器占用空间较大
时间换空间:迭代器就是节省了空间,但是取值时间较长
可跌代对象:
-
具有iter()方法就是一个可迭代对象
-
迭代器是基于上一次停留的位置,进行取值
-
迭代器:具有iter()和next()方法就是一个迭代器
day12
今日内容
-
生成器
-
推导式
-
内置函数
什么是生成器
-
核心:生成器的本质就是一个迭代器
-
迭代器python自带的
-
生成器程序员自己写的一种迭代器
生成器编写方式:
-
基于函数编写
-
def func(): print("这是一个函数") return "函数" func() def func(): print("这是一个生成器") yield "生成器" func() #函数体中出现yield代表要声明一个生成器 generator-----生成器 print(func()) 获取到的是一个生成器的内存地址 func() #生成一个生成器 print(func().__next__())#启动生成器 -
yield和return的区别:
-
相同点:
-
都是返回内容
-
都可以返回多次,但是return写多个只会执行一个
-
-
不同点:
-
return终止函数 yield是暂停生成器
-
yield能够记录当前执行位置
-
-
-
一个yield对应一个next
-
生成器的作用是节省空间
可迭代对象:
-
优点:list,tuple,str 节省时间,取值方便,使用灵活(具有自己的私有方法)
-
缺点:大量消耗内存
迭代器:
-
优点:节省空间
-
缺点:不能直接查看值,使用不灵活,消耗时间,一次性,不可逆
生成器:
-
优点:节省空间,人为定义
-
缺点:不能直接查看值,消耗时间,一次性,不可逆
使用场景:
-
当文件或容器数据量较大时,建议使用生成器
数据类型都是可迭代对象
数据类型(python3:range() |python2:xrange())都是可迭代对象 __iter__()
文件句柄是迭代器
__iter__() __next__() with open("a.txt","w",encoding="utf-8") as fsend()不讲
-
没有send方法就是一个迭代器,具有send方法的就是一个生成器
yield from 将可迭代对象逐个返回
yield将可迭代对象一次性返回
-
-
推导式方式编写
推导式
lst = []
for i in range(10):
lst,append(i)
print(lst)
列表推导式
普通循环:
print([i for i in range(10)])
print([变量 for循环])
筛选模式
lst = []
for i in range(10):
if i %2 ==0:
lst.append(i)
print(lst)
print([i for i in range(10) if i %2==0])
print([ 加工后的变量 for循环 加工条件])
集合推导式:
普通循环:
print({i for i in range(10)})
{变量 for循环}
筛选:
print({i for i in range(10) if i%2==1})
{加工后的变量 for循环 加工条件}
字典推导式:
普通循环
print({i:i+1 for i in range(10)})
{键:值 for循环}
筛选
print({i:i+1 for i in range(10) if i%2 ==0})
{加工后的键:值 for循环 加工条件}
生成器推导式:
普通模式
print((for i in range(10))
(变量 for循环)
筛选模式
tu = (i for i in range(10) if i >5)
(加工后的变量 for循环 加工条件)
for i in tu:
print(i)
内置函数一
eval() # 神器一 exec() # 神器二 注意:禁止使用
print(hash("123"))
hash()作用就是区分可变数据类型和不可变数据类型
help()查看帮助信息
callable()#查看对象是缶可调用
print(int("010101",16))转换进制
print(float(3))浮点数
print(complex(20))复数
print(bin(100)) 十进制转二进制
print(oct(10)) 十进制转八进制
print(hex(10)) 十进制转16进制
print(divmod(5,2)) #求(商,余)
print(round(4.66)) #保留小数位
print(pow(2,2))#幂 pow 两个参数是求幂 三个参数是求幂后的余
print(bytes("alex",encoding = "utf - 8"))#将字符串进行编码
print(ord("b")) #通过元素获取当前表位的序号
print(chr())#通过表位序号查找元素
print(repr()) 查看数据的原生态--给程序员使用的 print(a) 给用户使用的
lst = [1,2,3,4,5] print(all(lst))判断容器中的元素是否都为真 lst = [1,2,3,4,5,0,1,23] print(any(lst)) 判断容器中的元素是否有一个为真
print(globals()) #查看全局空间变量 print(locals()) #查看当前空间变量
day13
今日内容
-
匿名函数
-
内置函数二
-
普通
-
高阶
-
-
闭包
匿名函数 ==一行函数
-
匿名函数的名字叫做lambda
-
def func(): print(123) func() -
lambda == def ==关键字 :声明函数
-
#x是普通函数的形参(位置,关键字...)可以不接收参数(x:可以不写) #:后边x是普通函数的函数值(只能返回一个数据类型)(:x 后必须写) lambda x:x print((lambda x:x+6))(5) print([lambda :5][0]()) print((lambda :5))() a = lambda :5 a() 面试题拆解: lst = [] for i in range(5): def func(): return i lst.append(func) lst = [] # [lambda x:x+1,lambda x:x+1] for i in range(2): lst.append(lambda x:x+1) print(lst[-1](5)) lst = [lambda x:x+1 for i in range(5)] print(lst[0](5)) tu = (lambda :i for i in range(3)) print(next(tu)()) print(next(tu)()) print(next(tu)()) def func(): for i in range(3): # i = 0 1 2 def foo(): # foo1 foo2 foo3 return i yield foo # foo1 foo2 foo3 g = func() print(next(g)()) # foo1 print(next(g)) # foo2 print(next(g)) # foo3 lst = [lambda :i for i in range(3)] print(lst[0]()) tu = (lambda :i for i in range(3)) print(next(tu)()) 函数体中存放的是代码 生成器体中存放的也是代码 #就是yield导致函数和生成器的执行结果不统一lst = [lambda x:x+5 for i in range(2)] print([i(2) for i in lst]) lst = [] # [lambda x:x+5,lambda x:x+5] for i in range(2): lst.append(lambda x:x+5) new_lst = [] for i in lst: new_lst.append(i(2)) print(new_lst) lst = (lambda x:x+5 for i in range(2)) print([i(2) for i in lst]) def func(): for i in range(2): f = lambda x: x + 5 yield f g = func() lst = [] for i in g: lst.append(i(2)) print(lst) lst = [lambda x:x*i for i in range(2)] print([i(2) for i in lst]) #[2,2] lst = [] # [lambda x:x*i,lambda x:x*i] for i in range(2): lst.append(lambda x:x*i) # print(i) new_lst = [] for em in lst: new_lst.append(em(2)) print(new_lst) lst = (lambda x:x*i for i in range(2)) print([i(2) for i in lst]) #[0,2] def func(): for i in range(2): f = lambda x:x*i yield f g = func() lst = [] for i in g: lst.append(i(2)) print(lst) func = lambda x:[i for i in x] print(func('afafasd')) print(list('afafasd'))
内置函数
普通
print(dict(k = 1,v=2,c=3))
dic1 = {'key1':1,'key2':2}
dic2 = {'a':1,'b':2}
print(dict(**dic1,**dic2))
print(dict([(1,2),(3,3)]))
sep:每一个元素之间的分割的方法 默认" "
end:print执行完后的结束语句 默认\n
print(1,2,3,end = "")
file:文件句柄 默认是显示到屏幕
print(1,2,3,4,file= open('test','w',encoding = 'utf-8'))
print() #flush 刷新
sum()求和 #可迭代对象容器,容器的元素必须是数字
sum([1,2,34,78],100) 指定开始位置的值
abs()#绝对值
print(dir(list)) #查看当前对象所有方法 返回的是列表
zip()拉链 将两个可迭代对象合成一个元组 当长度不一致时选择最短的进行合并
lst1 = [1,2,34,5]
lst2 = ['alex','wusir','宝元']
print(list(zip(lst1,lst2)))#拉链
面试题:
print(dict(zip(lst1,lst2)))
print(format("alex",'>20'))#右对齐
print(format("alex",'<20'))#左对齐
print(format("alex",'^20'))#居中
print(format(10,'b')) #bin 2进制
print(bin(10))
print(format(10,'o')) #oct 8进制
print(format(10,'x')) #hex 16进制
print(format(0b1010,'d')) #digit 十进制
print(list(reversed("alex")))
高阶函数
filter --过滤
lst = [1,2,3,4,5,6]
print(list(filter(lambda x:x>3,lst)))
def func(a):
return a>1
print(list(filter(func,lst)))
def f(func,arvg):
lst = []
for i in arvg:
ret = func(i)
if ret:
lst.append(i)
return lst
def foo(a):
return a>2
print(f(foo,[1,2,3,4]))
foo不加括号是表示一个函数的内存地址
内部做了一个for循环
#filter()
#1.指定过滤的规则(函数名的内存地址)
#2.要过滤的数据 可迭代对象
map映射函数(将可迭代对象中对的每个元素都执行指定的函数)
print(list(map(lambda x:x,[1,2,3,4]))) map() 函数名(对每个元素进行执行指定的方法,可迭代对象)
sorted(排序)
可迭代对象,key=制定规则
print(sorted([1,2,3,4,5,6],reverse = True))#reverse是否是倒序 ,True倒序 False正序
print(sorted([1,2,3,4,5,6],key = abs ))#key指定排序规则
lst =[1,3,2,5,4]
lst2 = sorted(lst)
print(lst)#原列表不会改变
print(lst2)#返回的新列表是经过排序的
lst = ["三国演义","红楼梦","铁道游击队","西游记","水浒传","活着"]
print(sorted(lst,key=len))
字典:
lst =[{"age":19},{"age1":20},{"age2":80},{"age3":10}]
print(sorted(lst,key=lambda x:list(x.values())))
print(sorted(lst,key=lambda x:list(x.keys()),reverse=True))
dic = {1:'a',3:'c',2:'b'}
print(sorted(dic)) #字典排序返回的就是排序后的key
max()--最大值 可迭代对象,key=指定规则
print(max([10,12,13,15,-16],key=abs))
min()--最小值 可迭代对象,key=指定规则
reduce 累计算
from functools import reduce #从functools工具箱中拿来了reduce工具
def func(x,y):
return x+y
print(reduce(func,[1,2,3,4,5]))
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
闭包
在嵌套函数内,使用(非本层变量)非全局变量就是闭包
def func():
a = 1
def foo():
print(a)
print(foo.__closure__)#判断是不是闭包 返回None就不是闭包
func()
闭包的作用:
-
保护数据的安全性
-
装饰器
day14
今日内容
-
装饰器
装饰器:面试笔试必问
开放封闭原则:
-
代码扩展进行开放
-
修改源代码是封闭
在不修改源代码及调用方式,对功能进行额外的添加就是开放封闭原则
装饰器
装饰(额外功能) 器:工具(函数)
import time
#print(time.time()) #时间戳 小数
def index():
time.sleep(2) # 停留 秒
print("这是小明写的功能")
start_time = time.time()
index()
print(time.time() - start_time)
第一版装饰器
def index():
time.sleep(2)
print("这是小明写的功能")
def func():
time.sleep(2)
print("这是小刚写的功能")
def red():
time.sleep(2)
print("这是小红写的功能")
def times(func):
def foo():
start_time = time.time()#被装饰函数执行前干的事
func()
print(time.time() - start_time) #被装饰函数执行后干的事
return foo
index = times(index)
index()
定义 函数名 () 不写 格式 写了传参
def foo():
print("被装饰的函数")
def warpper(func): #func ==foo函数的内存地址
def inner():
print("宝元最骚")
func() #foo()
print("宝元最胖")
return inner #不能加括号 #return None
foo = warpper(foo) #不能加括号 foo = warpper(None)
foo()
def warpper(f):
def inner():
print("111")
f()
print("222")
return inner
@warpper
def func(): #func = warpper(func)
print("被装饰的函数1")
@warpper
def index(): #index = warpper(index)
print("被装饰的函数2")
func()
#python帮咱们做的一个东西,语法糖
#要将语法糖放在被装饰的函数正上方
def warpper(f):
def inner(*args,**kwargs):
print("11442")
ret = f(*args,**kwargs)
print("5152")
return ret
return inner
def func(*args,**kwargs):
print(f"{args,kwargs}")
return "445"
func = warpper(func)
print(func(1,12,5,45,1,455,1,a = 1)) 标准版装饰器拆解
def warpper(f):
def innner(*args,**kwargs):
print("被装饰函数执行前")
ret = f(*args,**kwargs)
print("被装饰函数执行后")
return ret
return innner
@warpper
def func(*args,**kwargs):
print(f"被装饰的{args,kwargs}")
return "我是func函数"
print(func(1,21,5,2,5,2,1,a=1))
标准版装饰器
day15
今日内容
-
装饰器进阶
-
有参装饰器 在标准版装饰器外层添加一层,额外需要多调用一层
-
多个装饰器装饰一个函数
-
-
递归
1.有参装饰器
语法糖:@auth(参数)
def auth(argv):
def warpper(func):
def inner(*args, **kwargs):
if argv == "博客园":
print("欢迎登录博客园")
user = input("user:")
pwd = input("pwd:")
if user == "alex" and pwd == "dsb":
func(*args, **kwargs)
elif argv == "码云":
user = input("user:")
pwd = input("pwd:")
if user == "alex" and pwd == "dsb":
func(*args, **kwargs)
return inner
return warpper
def foo():
print("被装饰的函数")
msg = input("请输入你要登录的名字:")
a = auth(msg)
foo = a(foo)
foo()
def auth(argv):
def wrapper(func):
def inner(*args,**kwargs):
if argv:
print("我加上功能了!")
func(*args,**kwargs)
else:
func(*args,**kwargs)
return inner
return wrapper
def foo():
print("这是一个点燃")
wrapper = auth(False)
foo = wrapper(foo)
foo()
def auth(argv):
def wrapper(func):
def inner(*args,**kwargs):
if argv:
print("我加上功能了!")
func(*args,**kwargs)
else:
func(*args,**kwargs)
return inner
return wrapper
@auth(False) #@auth ==foo =wrapper(foo)=auth(False) flask框架 搭网站的
def foo():
print("这是一个点燃")
foo()
多个装饰器装饰一个函数
多个装饰器装饰一个函数时,先执行离被装饰函数最近的装饰器
小技巧 :v
def auth(func):
def inner(*args,**kwargs):
print("额外增加了一道 锅包肉")
func(*args,**kwargs)
print("锅包肉 38元")
return inner
def wrapper1(func):
def inner(*args,**kwargs):
print("额外增加了一道 日魔刺生")
func(*args,**kwargs)
print("日魔刺生 白吃")
return inner
def wrapper2(func):
def inner(*args,**kwargs):
print("额外增加了一道 麻辣三哥")
func(*args,**kwargs)
print("难以下嘴")
return inner
@auth
@wrapper1
@wrapper2
def foo():
print("这是一个元宝虾饭店")
foo()
def foo():
print("这是一个元宝虾饭店")
#多个装饰器装饰一个函数时,先执行离被装饰函数最近的装饰器
foo = wrapper2(foo)
foo = wrapper1(foo)
foo = auth(foo)
foo()
递归
递: 一直传参
归: 返回 return
一递一归 归的时候不能间断
-
不断调用自己本身 (无效递归 --死递归)
递归的最大深度(层次) 官方说明1000 实际测试 998/997 def func(): print(1) func() func() -
有明确的终止条件
def func(n): if n == 3: return return func(n+1) func(1)meet = [["北京",["alex","wusir","太白金星","闫龙","景女神",["邢姨",["肖帮主","吴老板",["张晓波","王胜辉"]]]]], ["上海",["林海峰"],], ["深圳",["日天"]]] def func(m): for i in m: if type(i) == list: func(i) else: print(i) func(meet)
day16
今日内容
-
自定义模块
-
time
-
datetime
-
random
自定义模块
-
分类 认证 ,视频,评论
模块能干什么?
-
文件化管理 提高可读性,避免重复代码
-
拿来就用(避免重复造轮子) python中类库特别多
定义一个模块
-
一个文件就是一个模块(模块就是一个工具箱 工具(函数))
import
import test 导入 拿test工具箱 只能将整个工具箱拿来 导模块不能加后缀名
import导入同一个模块名时,只执行一次
import时会做三件事:
-
将test.py文件中所有代码读取到当前文件
-
当前文件开辟独立空间
-
等待被调用
import和from的区别:
-
from 只能执行导入的功能
-
import 能执行整个模块中所有的功能
-
from会容易将当前文件中定义的功能覆盖
-
from比import灵活
import只能导入当前文件夹下所有的模块
import后边不能加点操作
import和from使用的都是相对路径
import sys #和python解释器交互的接口
print(sys.path)
sys.path.append()
模块导入顺序:
append
-
内存> 内置>第三方>自定义
insert
-
内存>自定义>内置>第三方
import test as t #工具箱名字过长时可以起别名 避免覆盖之前的内容
#飘红不代表报错
from test import t1 #从test工具箱中将t1这个工具拿过来
t1()
from test import t1 as t
def t1():
print("2454")
t1()
t()
as支持import和from
from和import 推荐使用from
注意事项:(了解)
-
字节码
-
不能交叉导入,导入
-
自定义模块不能和内置模块重复
模块的两种用法
-
通过if __name__='__main__'判断 #当文件被当做模块被调用的时候__name__返回的当前模块名 #当文件当做脚本执行时__name__返回的__main__
-
当做模块被导入
-
当做脚本被执行
只有py文件当做模块被导入时,字节码才会进行保留
pip install 模块名 安装第三方模块
以后导入模块会产生的坑
-
注意自己定义模块的名字
-
注意自己的思路---循环导入时建议导入模式放在需要的地方
不建议一行导入多个模块
import from
from test import * #拿整个工具箱
通过__all__控制要导入的内容
time
import time #内置模块 --标准库
print(time.time())#时间戳 浮点数 1970年1月1日00:00:00
time.sleep(3) #秒
#将时间戳转换成结构化时间
print(time.localtime(time.time())) #命名元组 (不写) 当前时间戳
print(time.localtime(time.time())[0])
print(time.localtime(time.time()).tm_year)
print(time.localtime(15500000))
#将结构化时间转换成字符串
time_g = time.localtime(150000000)
time.strftime("%Y-%m-%d %H:%M:%S",time_g)
#将字符串转换成结构化时间
str_time = "2018-10-1 10:11:22"
time.strptime(str_time,"%Y-%m-%d %H:%M:%S")
#将结构化时间转换成时间戳
print(time.mktime(time_g))
%Y 年
%m 月
%d 日
%H 小时
%M 分钟
%S 秒
datetime
from datetime import datetime,timedelta
print(datetime.now())#获取当前时间
print(datetime(2018,10,1,10,10,10))
print(datetime(2018,10,1,10,10,10) - datetime(2018,10,30,10,10,10))#指定时间
#将对象转换成时间戳
d = datetime.now()
print(d.timestamp())
#将时间戳转换成对象
import time
f_t = time.time()
print(datetime.fromtimestamp(f_t))
#将对象转换成字符串
d = datetime.now()
print(d.strftime("%Y-%m-%d %H:%M:%S"))
#将字符串转换成对象
s = "2018-12-31 10:11:12"
print(datetime.strptime(s,"%Y-%m-%d %H:%M:%S"))
#可以进行加减法
print(datetime.now() - timedelta(day = 20))
print(datetime.now() - timedelta(hours = 20))
random ---随机数
import random print(random.randint(1,50))#选择1-50之间随机的整数 print(random.random()) #默认0-1之间的随机小数,不包含1 print(random.uniform(1,3))#1-10之间随机小数,不包含10 print(random.choice((1,2,3,4,5,6,7)))#从容器中随机选择一个 print(random.choice((1,2,3,4,5,6,7),k=3))#从有序容器中随机选择3个元素,以列表的形式返回,会出现重复元素 print(random.sample((1,2,3,4,5,6,7),k=3))#从容器中随机选择3个元素,以列表的形式返回,不会出现重复元素 返回的是列表 print(random.randrange(1,10,2))#随机的奇数或随机的偶数 lst = [1,2,3,4,5,6,7] random.shuffle(lst) #洗牌 将有序的数据打散 print(lst)
day17
今日内容
-
软件开发规范
-
序列化 json pickle
-
os 文件夹 文件 路径
-
sys 4
-
hashlib
-
collection
软件开发规范 --文件
几百行 --大几万行
当代码存在一个py文件中时
-
不便于管理 修改 增加
-
可读性差
-
加载速度慢
Django ---雏形
约定俗称
-
启动文件 启动接口 starts bin文件夹
-
公共文件 大家需要的功能 common lib文件夹
-
配置文件(静态文件)变量 settings conf文件夹 (数据库连接 redis)
-
主逻辑 核心 (函数,类) src.py core文件夹
-
用户相关数据 账号和密码等文件 register db文件夹
-
日志 记录重要信息,记录开发人员的行为 logg.log log文件夹
sys -- python解释器做交互
import sys print(sys.path) #模块查找的顺序 *** print(sys.argv) #只能在终端执行 cmd print(sys.modules) #查看加载到内存的模块 print(sys.platform) #查看当前操作系统平台 mac --darwin win --win32 mac --linux 查看ls win dir print(sys.version) #查看当前解释器的版本
序列化:
-
json
-
pickle
json
-
4个方法 2组
-
dumps loads --用于网络传输
-
dump load --用于文件存储
-
用于网络传输
dic = '{"key":1}'
手写
new_dic ={}
k,v = dic.replace("{","").replace("}","").repalce('"',"").split(":")
new_dic[k] = v
print(new_dic["key"])
import json
s = json.dumps(dic)
print(s,type(s))
d= json.loads(s)
print(d,type(d))
json是所有语言共有的 语言沟通桥梁
将数据类型转换成字符串(序列化),将字符串转换成原数据类型(反序列)
-
序列化:
-
字典 ,列表,元组序列后自动变成列表
-
用于文件存储
dic = {"key":1}
json.dump(dic,open("a","a",encoding="utf-8")) #将原数据类型转换成字符串,写入到文件操作中
print(json.load(open("a","r",encoding = "utf-8"))['key']) #将文件中的字符串转换成原数据类型
dic = {"key":1}
f = open("a","a",encoding="utf-8")
f.write(json.dumps(dic)+"\n")
f1 = open("a","r",encoding = "utf-8")
for i in f1:
print(json.loads(i),type(json.loads(i)))
dic = {"key":"宝元"}
print(json.dumps(dic,ensure_ascii =False,sort_keys =True))
pickle
只有python有,几乎可以序列python中所有数据类型,匿名函数不能序列
import pickle
def fun():
print(1)
a = pickle.dumps(func) #将原数据类型转换成类似字节的内容
print(pickle.loads(a)) #将类似字节的内容转换成原数据类型
os
工作路径
import os #os是和操作系统做交互,给操作发指令
print(os.getcwd()) #获取当前文件工作的路径
print(os.chdir("绝对路径")) #路径切换
print(os.getcwd())
print(os.curdir) 目录
print(os.pardir) 父目录
文件夹
os.mkdir("a2") #创建文件夹
os.rmdir("a2") #删除文件夹
os.makedirs('a1/a2/a3') #递归创建文件夹
os.removedirs("a1/a2/a3") #递归删除文件夹
os.listdir("绝对路径") #查看当前文件夹下所有的内容
文件
os.remove("绝对路径") #删除文件,彻底删除,找不回来
os.rename("绝对路径") #重命名
路径
os.path.abspath("相对路径") #返回的是绝对路径***
os.path.split("路径")#将路径分割成一个路径和一个文件名
print(os.path.dirname("路径")) #获取到父目录 ***
print(os.path.basename("路径")) #获取文件名字
print(os.path.join("D:\Python","day17","test"))#路径拼接 ***
判断
print(os.path.exists("")) #判断路径是否存在
print(os.path.isabs("绝对路径"))#判断是不是绝对路径
print(os.path.isdir("")) #判断是不是文件夹
print(os.path.isfile("")) #判断是不是文件
print(os.path.getsize("")) #获取文件大小
hashlib
Python 2与Python 3的区别
-
源码
-
Python 2:源码不统一,源码重复
-
Python 3:源码统一,源码不重复
-
-
input
-
Python 2 中的input获取到的就是数据本身
-
Python 3 中的input获取到的内容都是字符串
-
-
除法
-
Python 2:除法返回的是整数(向下取整)
-
Python 3:除法返回的是浮点数
-
-
print语句
-
Python 2 中print语句有的包含括号,有些不包含
-
Python 3 中print语句必须有括号
-
-
整型
-
python 2:整型,长整型long
-
python 3:全是整型
-
-
print(range(1,10))-
Python 3: 中打印range时自己本身
-
Python 2: 中打印range获取的是一个列表,列表的元素是1-9
-
-
编码
-
python 2: 中默认编码ASCII,不支持中文
-
python 3 :中默认编码Unicode
-
-
range
-
Python 2 :中打印range获取的是一个列表,列表的元素是1-9
-
-

浙公网安备 33010602011771号