python从开始到灭亡

Python从零

预科

day01

  1. 主机核心部件: 主板:集成电路板,其他硬件都在主板上 cpu:核心计算单元 内存:断电之后内存里的内容消失 硬盘:断电之后还能永久保存的元件 电源:保证电压的稳定 外设:输入输出设备的总成

  2. 操作系统: 总管:对硬件和软件的总体调配

 

  1. 编程语言:(Python Java C PHP 。。。) 为了让人与电脑进行对话 编程语言有很多种

  2. 解释器: 把代码转化成机器能认识的指令


 

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

主要内容
  1. markdown常用语法

  2. 博客园制作

  3. 思维导图

  4. 排bug技巧

 

markdown常用语法

 

  1. 用#+空格实现

一级标题

二级标题

。。。。。。。。

六级标题
  1. 代码块

    三个实现

    python is a ...

    单行代码,用“``”

  2. 列表

    有序列表

    ~~~

无序列表

    ```
  • 跟内容

  • 跟内容

  • 跟内容 ```

  1. 链接

    • [目标地址名字](目标地址的地址)
      通过快捷键:ctrl + k
    • 百度

  2. 键盘快捷键之缩进

    • 往前缩进shif+tab

    • 往后缩进tab

  3. 图片:

    • md文件传输时图片丢失的两种解决办法

      • 保存时,点击左上角的文件,选择导出PDF

      • 借助网络上的平台,把文件上传上去,然后用网络地址代替

  4. 分割线

    • ---实现分割线的效果
      +++实现分割线的效果
      ***实现分割线的效果
  5. 字体样式

    • 加粗

    • **加粗**
    • 倾斜

    • *倾斜*
    • 加粗倾斜

    • ***加粗倾斜***

    • 颜色黄绿色<span style="color:yellowgreen">黄绿色</span>

    • 字体宋体 黄绿色 黄绿色<span style = "font -family:宋体">黄绿色</span>

思维导图
  1. 有层级关系

  2. 从大范围到具体

  3. 要求:每周至少上交一篇思维导图,上交码云。

    编程语言

    编译型

    C

    C++

    ......

    解释型

    Python

    PHP

    ......

    Python

    基础语法

    基础数据类型

    str

    方法&操作

    int

    bool

    list

    .....

    函数

    ......

    进阶

    面向对象

    ......

  4. 思维导图制作工具:

  5. 常用快捷键:

    • 建立子分局

    • 建立兄弟分区

  6. 思维导图何时可用,何时不可用。

    • 确定的东西,并且有联系,用思维导图帮助我们总结记忆。

    • 两个事物之间没有必然联系,不适合用思维导图。

  7. 学会使用思维导图去整理

博客

https://github.com/search?q=%E5%8D%9A%E5%AE%A2%E5%9B%AD%E4%B8%BB%E9%A2%98

好处:走上人生巅峰的捷径,好处非常多

什么样的内容能作为博客发表?

系技术,以你自己的观点发表。

借鉴国外的一些新技术或者新研究

自己的笔记,要求自己的笔记要成体系。

    1. 写博客的平台
      + 博客园:学不完的技术,但是这个平台的推广不好,页面比较low。
      + CSDN:推广非常好,广告做的比较好
排bug技巧

http://www.stackoverflow.com/

  1. 根据错误类型推算,错误哪里出的原因。

  2. 百度搜索

  3. stackoverflow

  4. 建议:自己搞一个bug集合,搞得特别好的可以公开展示,加分

码云的日常操作

要求:

  1. 每日代码&笔记上传码云

    1. 每日作业通过老师给的issues写作业,并回复老师的issues

  2. 每周至少一次思维导图,并上传码云

  3. 前期每周一次周末大作业上传码云

  4. 大笔记每周至少更新一次,上传码云

 

 

 

 

 

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)
运算符
  1. 算数运算符

    +
    -
    *
    /
    %(取余)
    **(幂/次方) 
    //(整除/地板除 - 向下取整)
    

     

  2. 比较运算符

    > < >= <= == != 
    
  3. 赋值运算符

    = 
    += 自加
    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

今日内容
  1. 列表

  2. 元组

  3. 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

  1. 字典

  • 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

今日内容
  1. 小数据池 --

  2. 深浅拷贝

  3. 集合

小数据池

 

  • 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

  1. 基础数据类型补充

  2. 以后会遇到的坑

  3. 二次编码

 

基础数据类型补充
  1. 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
    字符串进行加操作,乘操作都是开品新的空间
    
  2. 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)
    列表在进行乘法的时候,元素是共用的
    
  3. 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)
    
  4. 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

文件操作

  1. 找到文件位置

  2. 双击打开

  3. 进行一些操作 # r --read(读) w --write(写) a --追加

    • rb--(读字节)wb ab r+ w+ a+

  4. 关闭文件

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操作--清空写
  1. 先清空文件(打开文件的时候清空)

  2. 写入内容

当模式为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

  1. 函数

    • 定义函数

    • 调用函数

    • 函数的返回值

    • 函数的参数

 

函数初识
  1. 什么是函数?

    • 将某个功能封装到一个空间中就是一个函数

    • 减少重复代码

    • 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()
 
今日总结
  1. 函数进阶:

    • 动态参数

      • *args 动态位置参数

      • **kwargs 动态默认参数

      • 位置>动态位置>默认>动态默认

      • 定义的时候是*是聚合

      • 函数体和实参是打散

      • *args,**kwargs

    • 函数的注释

      函数名._doc_ 查看注释内容
      函数名._name_ 查看函数名称
      

       

    • 名称空间

      • 加载

        • 内置空间>全局空间>局部空间

      • 取值

        • 局部空间>全局空间>内置空间(就地原则)

      • 作用域:

        • 全局作用域:全局+内置

        • 局部作用域:局部

    • 函数的嵌套

      • 不管在什么位置,只要是函数名()就是在调用函数

    • global nonlocal

      • global :只修改全局

        nonlocal:只修改局部,修改离弄nonlocal最近的一层,上一层没有继续向上上层查找,只限在局部

day11

今日内容
  1. 函数名的第一类对象及使用

  2. f-strings 格式化

  3. 迭代器

    • python三大器

      • 迭代器

      • 生成器

      • 装饰器 ---装饰器进阶

函数名的第一类对象及使用
  1. 当做值,赋值给变量

    def func():
        print(1)
    print(func)  #查看的函数的内存地址
    a = func
    print(a)  
    a()
    
  2. 可以当做容器中的元素

    lst=[]
    dic={}
    def func():
        print(1)
    def foo():
        print(2)
    lst = [func,foo]
    print(lst)
    

     

  3. 函数名可以当做函数的参数

    def foo(a):
        a()
        print(111)
    def func():
        print(222)
        def f1():
            print(333)
        foo(f1)
    func()
    
  4. 函数名可以当做函数的返回值

    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

今日内容

  1. 生成器

  2. 推导式

  3. 内置函数

什么是生成器
  • 核心:生成器的本质就是一个迭代器

  1. 迭代器python自带的

  2. 生成器程序员自己写的一种迭代器

生成器编写方式:
  • 基于函数编写

    • 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 f
    

    send()不讲

    • 没有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

今日内容

  1. 匿名函数

  2. 内置函数二

    • 普通

    • 高阶

  3. 闭包

匿名函数 ==一行函数
  • 匿名函数的名字叫做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() 

闭包的作用:

  1. 保护数据的安全性

  2. 装饰器


day14

今日内容

  • 装饰器

装饰器:面试笔试必问

开放封闭原则:

  1. 代码扩展进行开放

  2. 修改源代码是封闭

在不修改源代码及调用方式,对功能进行额外的添加就是开放封闭原则

装饰器

装饰(额外功能) 器:工具(函数)

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. 装饰器进阶

    • 有参装饰器 在标准版装饰器外层添加一层,额外需要多调用一层

    • 多个装饰器装饰一个函数

  2. 递归

 

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

一递一归 归的时候不能间断

  1. 不断调用自己本身 (无效递归 --死递归)

    递归的最大深度(层次)  官方说明1000 实际测试 998/997
    def func():
        print(1)
        func()
    func()
    
  2. 有明确的终止条件

    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

今日内容

  1. 自定义模块

  2. time

  3. datetime

  4. 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

今日内容

  1. 软件开发规范

  2. 序列化 json pickle

  3. os 文件夹 文件 路径

  4. sys 4

  5. hashlib

  6. 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) #查看当前解释器的版本
序列化:
  1. json

  2. 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的区别

  1. 源码

    • Python 2:源码不统一,源码重复

    • Python 3:源码统一,源码不重复

  2. input

    • Python 2 中的input获取到的就是数据本身

    • Python 3 中的input获取到的内容都是字符串

  3. 除法

    • Python 2:除法返回的是整数(向下取整)

    • Python 3:除法返回的是浮点数

  4. print语句

    • Python 2 中print语句有的包含括号,有些不包含

    • Python 3 中print语句必须有括号

  5. 整型

    • python 2:整型,长整型long

    • python 3:全是整型

  6. print(range(1,10))

    • Python 3: 中打印range时自己本身

    • Python 2: 中打印range获取的是一个列表,列表的元素是1-9

  7. 编码

    • python 2: 中默认编码ASCII,不支持中文

    • python 3 :中默认编码Unicode

  8. range

    • Python 2 :中打印range获取的是一个列表,列表的元素是1-9

    • Python 3 :中打印range时是自己本身

猜你喜欢

转载自www.cnblogs.com/suimeng123/p/11401808.html
今日推荐