Python学习笔记

第一章 计算机基础

1.1 硬件

计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 等组成,只有硬件但硬件之间无法进行交流和通信。

1.2 操作系统

  1. 作用:操作系统用于协同或控制硬件之间进行工作

  2. 常见的操作系统

  • windows,丰富的图形化界面、收费、大量工具、适用于个人办公
    • XP
    • win7
    • win10
    • window server
  • linux,性能好、占用资源少、适用于做服务器
    • centos:公司线上一般用
    • ubuntu
    • redhat
  • mac,人性化交互好、好看好用、适用于个人使用

1.3 解释器或编译器

编程语言的开发者写的一个工具,将用户写的代码转换成010101交给操作系统去执行。

1.3.1 编译型语言和解释性语言

  1. 编译型语言:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行
    • 常见的编译型语言:C,C++,Java,C#,Go等
  2. 解释型语言:写完代码交给解释器,解释器会从上到下一行行代码执行:边解释边执行(实时翻译)
    • 常见的解释型语言:Python,PHP,ruby等

1.4 软件(应用程序)

软件又称为应用程序,就是我们在电脑上使用的工具,类似于:记事本 / 图片查看 / 游戏

1.5 进制

对于计算机而言无论是文件存储 / 网络传输输入本质上都是:二进制(010101010101),如:电脑上存储视频/图片/文件都是二进制; QQ/微信聊天发送的表情/文字/语言/视频 也全部都是二进制。

进制:

  • 2进制,计算机内部。
  • 8进制
  • 10进制,人来进行使用一般情况下计算机可以获取10进制,然后再内部会自动转换成二进制并操作。
  • 16进制,一般用于表示二进制(用更短的内容表示更多的数据),一版是:x 开头。
二进制 八进制 十进制 十六进制
0 0 0 0
1 1 1 1
10 2 2 2
11 3 3 3
100 4 4 4
101 5 5 5
110 6 6 6
111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 10 a
1011 13 11 b
1100 14 12 c
1101 15 13 d
1110 16 14 e
1111 17 15 f
10000 20 16 10

第二章 Python入门

2.1 环境的安装

  1. 解释器

    • 设置环境变量(注意设置系统的环境变量)

    • 多环境共存
      • python2.7
      • python3.6
  2. 开发工具:pycharm
    • pycharm变更解释器

2.2 编码

2.2.1 编码基础

  1. ascii
    • 1字节,8位
    • 只包含英文和符号
    • 占用内存少
  2. unicode(万国码)
    • 4字节,32位
    • 包含所有的语言
    • 占用内存大
    • 种类:
      • ecs2
      • ecs4
      • 注:现在通常是用ecs4
  3. utf-8(对unicode的压缩)
    • 1-4字节,8的倍数位(8、16、24、32位)
    • 包含所有的语言
    • 优化了unicode占用内存太大的问题
    • 中文用3个字节表示
  4. utf-16
    • 注:电脑上用unicode保存,其实是用的utf-16保存的
  5. gbk
    • 已全包含中文
    • 中文用2个字节表示
  6. gb2312(gbk的升级版)
    • 已全包含中文
    • 中文用2个字节表示

2.2.2 python编码相关

  1. python解释器默认编码(python2与python3的区别一)
    • python2 解释器默认编码:ascii
    • python3 解释器默认编码:utf-8
  2. 指定python解释器使用utf-8
    • 在文件头添加:#-- coding:utf-8 - -,则完成指定
    • 注:建议无论使用python2或python3执行,均添加
# -*- coding:utf-8 -*- 

注意:对于操作文件时,要按照:以什么编写写入,就要用什么编码去打开。

  1. 单位转化
    • 常用单位:位(bit),字节(byte),KB,兆(MB),GB.TB等
    • 常见转化:
      • 8 bit = 1 byte
      • 1024 byte = 1 KB
      • 1024 KB = 1 MB
      • 1024 MB = 1 GB
      • 1024 GB = 1 TB

2.3 输入和输出

  1. 输入

    • input("请输入你的姓名:")

    • input输入得到的内容永远是字符串

    • python版本的区别(python2与python3的区别三)
      • python2:name=raw_input('请输入姓名')
      • python3:name=input('请输入你的姓名')
  2. 输出

    • print(你想要输出的东西)
    • python版本的区别(python2与python3的区别二)
      • python2:print "你好"
      • python3:print("你好")
      • 注:python2.7以上两种均可以

2.4 变量

  1. 要求
    • 变量名只能包含字母,数字和下划线
    • 变量名不能用数字开头
    • 变量名不能是python的关键字
  2. 建议
    • 见名知意:name='alex' 或者age=18
    • 名字太长用下划线:lily_dad='tom'
    • 补充:LilyDad="tom" (驼峰式命名)
  3. 问:为什么要有变量?

    答:为某个值创建一个“外号”,以后在使用时候通过此外号就可以直接调用。

2.5 注释

  1. 单行注释

    • 行头加#
    • 例:# 用户 密码
  2. 多行注释

    • 使用三引号

    • 例:"""

      ​ 用户

      ​ 密码

      ​ """

2.6 条件语句

2.6.1 基本格式

  1. 初级条件语句(if语句)

    #基本格式:
    if 条件:
     print('结论一')
    else:
     print('结论二')
  2. elif语句

    #基本格式:
    if 条件一:
     print('结论一')
    elif 条件二:             #elif的数量不限制
     print('结论二')
    elif 条件三:
     print('结论三')
    else:
     print('结论四')
  3. 最简单(只有一个if)

    #基本格式:
    if  条件:
     print('结论') 
  4. if条件语句嵌套

    #10086示例
    message = """欢迎致电10086
    1.话费查询;
    2.流量服务;
    3.业务办理;
    4.人工服务"""
    print(message)
    index = input('请输入你要选择的服务:')
    index = int(index)
    if index==1:
    print('话费查询')
    elif index == 2:
    print('流量服务')
    elif index == 3:
    content = """业务办理
    1. 修改密码;
    2. 更改套餐;
    3. 停机;"""
    print(content)
    value = input('请输入要办理的业务:')
    value = int(value)
    if value == 1:
    print('修改密码')
    elif value == 2:
    print('更改套餐')
    elif value == 3:
    print('停机')
    else:
    print('错误')
    elif index == 4:
    print('人工服务')
    else:
    print('输入错误')

2.6.2 三元运算(三目运算)

  1. 用途:用于简单的if条件语句
  2. 基本结构
v = 前面 if 条件 else 后面
#如果条件为真,v = 前面,否则,v = 后面

"""
相当于
if 条件:
    v = 前面
else:
    v = 后面
"""
# 让用户输入值,如果值是整数,则转换成整数,否则赋值为None
data = input('>>>') value =  int(data) if data.isdecimal() else None 
  1. 注意:现阶段先不要直接使用三元运算,先做出来,再思考如何简化

2.7 循环语句

2.7.1 while循环

  1. 基本循环结构
while True:
    print('你想要循环的东西')
  1. while后面加条件
while 1>0 and 1<2:
    print('你好')
  1. 关键词
  • pass:通过

    count = 1
    while count <=10:
      if count == 7:
          pass    #跳过,不打印
      else:
          print(count)
      count = count + 1
  • break:终止(当前循环)

    while True:
      print('666')
      while True:
          print('888')
          break   #终止第二个while循环
      break   #终止第一个while循环
  • continue:继续

    count = 1
    while count <=10:
      if count == 7:
          count = count + 1
          continue    #不再继续往下走,而是回到while条件的位置
      print(count)
      count = count + 1
  1. while-else结构
count = 1
while count <=10:
    print(count)
    count = count + 1
else:   #不再满足while后的条件时,或者条件=False时,触发
    print(666)

2.7.2 for循环

  1. 使用方式
name = 'alex'
for item in name:
    print(item)
  1. 注意
    • 用循环打印字符串的每个元素:for > while
    • 死循环:while > for
    • for和while的应用场景:有穷尽优先用for,无穷尽用while
  2. for循环 + range
#示例:打印1 - 10
# range(0,10):[1,2,3,4,5,6,7,8,9]
for i in range(0,11):
    print(i)
  1. range
  • range(0,10,1) #[0,1,2,3,4,5,6,7,8,9]
  • range(9,-1,-1) #[9,8,7,6,5,4,3,2,1,0]
  • range(0,10,2) #[0,2,4,6,8]
  • 前面的两个数0,10按切片理解
  • 后面的一个数2代表隔一个数取一个数
  • 后面的那个数正数代表从左到右取,负数代表从右到左取,不写就是默认为1

2.8 运算符

  1. 算数运算

    #示例:打印1-100之间的奇数
    count = 1
    while count <= 100:
     val = count % 2
     if val == 1:
         print(count)
     count = count + 1
  2. 赋值运算

    count += 1等价于count = count + 1

  3. 逻辑运算(and,or,not)

    • 一般情况,用于判断(布尔类型)

    • 二般情况,用于取值

      • or value = x or y

        如果x转化为布尔类型为False,则value = y

        如果x转化为布尔类型为True,则value = x

        如果有多个or条件,则从左到右依次进行上述流程

      • and value = x and y

        如果x转化为布尔类型为False,则value = x

        如果x转化为布尔类型为True,则value = y

        如果有多个and条件,则从左到右依次进行上述流程

      • 同时有and和or条件,有括号的先算括号,没有就先算and再算or

      • 优先级:( ) > not > and > or

    • 补充

      • in 在里面
      • not in 不在里面
      • 优先级补充(>优先于not)

第三章 数据类型

3.1 整型(int)

  1. 数字表示

    • python2

      • 64位机器,范围-2^63~2^63-1

      • 超出上述范围,python自动转化为long(长整型)

        注:long(长整型)数字末尾有一个L

    • python3

      • 所有整型都是int,没有long(长整型)
  2. 整型除法

    • python2:只能保留整数位
    • python3:可以保留所有内容

3.2 布尔(bool)

  1. 布尔值就是用于表示真假
  2. 布尔值:True和False
  3. 其他类型转换成布尔值:
    • 整型转换为布尔值
      • 0转换后是False
      • 其他转换为True
    • 字符串转换为布尔值
      • ""转换后是False
      • 其他转换为True
    • 列表转换为布尔值
      • []转换后是False
      • 其他转换为True
    • 元组转换为布尔值
      • ()转换后是False
      • 其他转换为True
    • 字典转换为布尔值
      • {}转换后是False
      • 其他转换为True
    • 集合转换为布尔值
      • set()转换后是False
      • 其他转换为True
    • None转换为布尔值:False

3.3 字符串(str)

字符串是写代码中最常见的,python内存中的字符串是按照:unicode编码存储

字符串是不可变类型

字符串自己的方法:

  1. upper/lower:字母大小写转换

    • upper:字母小写转换为大写
    • lower:字母大写转换为小写
v1 = 'alex'
v2 = v1.upper()
print(v2)          #'ALEX'

v3 = v2.lower()
print(v3)          #'alex'
  1. isdigit:判断字符串是否为数字
v1 = 'alex'
date1 = v1.isdigit()
print(date1)        #False

v2 = '666'
date2 = v2.isdigit()
print(date2)        #True
  1. strip/rstrip/lstrip:去除空格
    • strip:去除左右两边的空格
    • rstrip:去除右边的空格
    • lstrip:去除左边的空格
v = ' alex '
date1 = v1.strip()
print(date1)         #'alex'

date2 = v.rstrip()
print(date2)         #' alex'

date3 = v.lstrip()
print(date3)         #'alex '
  1. replace:替换
v = '今天我要吃炒饭炒饭炒饭'
date1 = v.replace('炒饭','烤鸭')      #替换所有炒饭
print(date1)                         #'今天我要吃烤鸭烤鸭烤鸭'

date2 = v.replace('炒饭','烤鸭',1)     #只替换第1个炒饭
print(date2)                           #'今天我要吃烤鸭炒饭炒饭'
  1. split/rsplit:切割
    • split:从左到右切割
    • rsplit:从右到左切割
v = '今天我要吃炒饭、烧鸡、烤鸭'
date1 = v.split('、')       #从左到右,切割所有的顿号
print(date1)                #['今天我要吃炒饭','烧鸡','烤鸭']

date2 = v.split('、',1)     #从左到右,切割第一个顿号
print(date2)                #['今天我要吃炒饭','烧鸡、烤鸭']

date2 = v.rsplit('、',1)     #从右到左,切割第一个顿号
print(date2)                 #['今天我要吃炒饭、烧鸡','烤鸭']
  1. startswith/endswith:判断是否已什么开头/结尾
    • startswith:判断是否已什么开头
    • endswith:判断是否已什么结尾
v = 'alex'
date1 = v.startswith('al')
print(date1)         #True

date2 = v.endswith('ex')
print(date2)         #True
  1. format:字符串格式化
date = '他叫{0},今年{1}'.format('张三',22)
print(date)          #'他叫张三,今年22'
  1. encode:将unicode存储转换为其他编码存储
name = '张三'                    #解释器读取到内存后,用unicode存储
date1 = name.encode('utf-8')     #将unicode存储转换为utf-8存储
date2 = name.encode('gbk')       #将unicode存储转换为gbk存储
  1. join:循环每个元素,并在元素和元素之间加入加入连接符
v = 'alex'
date = "_".join(v)     #循环每个元素,并在元素和元素之间加入"_"
print(date)            #'a_l_e_x'

3.4 列表(list)

想要表示多个事物,可以用列表

列表是可变类型

列表自己的方法:

  1. append:追加
v = ['张三','李四','王五']
v.append(666)
print(v)               #['张三','李四','王五',666]
  1. insert:插入
v = ['张三','李四','王五']
v.insert(1,666)
print(v)               #['张三',666,'李四','王五']
  1. remove:删除(指定元素)
v = ['张三','李四','王五']
v.remove('李四')
print(v)               #['张三','王五']
  1. pop:删除(索引位置的元素)
v = ['张三','李四','王五']
v.pop(o)
print(v)               #['李四','王五']
  1. clear:删除全部内容
v = ['张三','李四','王五']
v.clear(o)
print(v)              #[]
  1. extend:循环加入
v = ['张三','李四','王五']
v1 = [1,2,3]
v.extend(v1)          #把v1中的元素循环追加到v中
print(v)              #['张三','李四','王五',1,2,3]
  1. reverse:反转
v = [1,3,6,4,2,5]
v.reverse()
print(v)             #[5,2,4,6,3,1]
  1. sort:排序
v = [1,3,6,4,2,5]
v.sort(reverse = False)       #从小到大排序[默认:.sort()]
print(v)                      #[1,2,3,4,5,6]

v.sort(reverse = True)        #从大到小排序
print(v)                      #[6,5,4,3,2,1]

3.5 元组(tuple)

元组是不可变类型

没有自己的方法

3.6 字典(dict)

用于帮助用户去表示一个事物的信息(事物是有多高属性的)

字典是可变类型

字典自己的方法:

  1. keys:获取字典中所有的键
info = {'name':'张三','age':22,'gender':'男'}
for i in info.keys():
    print(i)                 
"""
'name'
'age'
'gender'
"""
  1. values:获取字典中所有的值
info = {'name':'张三','age':22,'gender':'男'}
for i in info.values():
    print(i)  
"""
'张三'
22
'男'
"""
  1. items:获取字典中所有的键值对
info = {'name':'张三','age':22,'gender':'男'}
for a,b in info.items():
    print(a,b) 
"""
'name','张三'
'age',22
'gender','男'
"""
  1. get:索引取值
info = {'name':'张三','age':22,'gender':'男'}
v1 = info.get('name')
print(v1)                     #'张三',相当于v1 = info['name']

v2 = info.get('hobby')
print(v2)                     #None

v3 = info.get('hobby',666)    #如果'hobby'这个键不存在就输出666
print(v3)                     #666
  1. pop:删除(索引位置的元素)
info = {'name':'张三','age':22,'gender':'男'}
v = info.pop('name')         #删除'name':'张三'这个键值对,并把'张三'赋值给v1
print(v)                     #'张三'
print(info)                  #{'age':22,'gender':'男'}
  1. update:批量添加(修改)
    • 不存在则添加,存在则修改
info = {'name':'张三'}
info.update({'age':22,'gender':'男','name':'李四'})       #添加'age'和'gender',修改了'name'对应的值
print(info)                   # {'name':'李四','age':22,'gender':'男'}

3.7 集合(set)

特性:无序性,可变性,互异性

空集合表示方式:v = set()

集合自己的方法:

  1. add:添加(已有的不再添加)
v = {1,2,3}
v.add(4)                 #添加4
v.add(3)                 #3是已有的,不再添加
print(v)                 #{1,2,3,4}   
  1. discard:删除
v = {1,2,3}
v.discard(2)             #删除2
print(v)                 #{1,3}
  1. update:批量添加
v = {1,2,3}
v.update({4,5,6})        #添加4,5,6
print(v)                 #{1,2,3,4,5,6}
  1. intersection:交集
v = {1,2,3}
date = v.intersection({1,3,4})      #取v和{1,3,4}的交集
print(date)              #{1,3}
  1. union:并集
v = {1,2,3}
date = v.union({1,3,4})             #取v和{1,3,4}的并集
print(date)              #{1,2,3,4}
  1. difference:差集
v1 = {1,2,3}
v2 = {1,3,4}
date1 = v1.difference(v2)           #取v1和v2的差集,v1中有v2中没有的
print(date1)             #{2}

date2 = v2.difference(v1)           #取v2和v1的差集,v2中有v1中没有的
print(date2)             #{4}
  1. symmetric_difference:对称差集
v = {1,2,3}
date = v.symmetric_difference({1,3,4})        #取v和{1,3,4}的对称差集
print(date)              #{2,4}

3.8 公共功能

  1. 长度:len

  2. 索引

  3. 切片

  4. 步长

    #笔试题:请将字符串反转
    name = 'alex'
    val = name[::-1]
    print(val)  #xela
  5. for循环

  6. 删除:del

    • remove,pop和del的区别
      • remove #根据值删除,不存在则报错
      • deleted = li.pop(2) #删除列表中指定的一个,另将被删除的数据赋值给deleted
      • del li[2] #仅仅是删除
      • del li[2:4] #del还可以删除列表中指定的一段
  7. 修改

3.9 总结

  1. 列表(list)/字典(dict)/集合(set)
    • 不能放在集合中
    • 不能作为字典的键(key)
  2. hash(哈希)是怎么回事?
    • 因为在内部会将值进行哈希算法,并得到一个数值(对应内存地址),以后用于快速查找
  3. 注意:
#第1点:
info = {0,1,2,False,'你好',None,(1,2,3)}
print(info)      #{0,1,2,'你好',None,(1,2,3)}
#因为False相当于0,所以False不输出

#第2点:
info = {
    1:'alex',           #因为True相当于1,所以把1对应的值修改了
    True:'oldboy'
}
print(info)     #{1:'oldboy'}

3.10 嵌套

  1. 列表嵌套

    #示例:
    users = ['alex',0,True,[11,22,33,'老男孩']]
    users[3]   #[11,22,33,'老男孩']
    users[3][-1]   #'老男孩'
    users[3][-1][2]   #'男'
  2. 列表和元组嵌套

    #例1
    v2 = [11,22,33,(11,22,33)]
    v2[-1][1] = 99   #错误
    v2[-1] = 99   #正确
    #例2
    v3 = (11,[1,2,3],22,33)
    v3[1] = 99   #错误
    v3[1][2] = 99   #正确
    #总结:列表中元素可以被修改和删除,元组中元素不可被修改和删除

3.11 数据类型的相互转换

  1. 整型(int)
    • int('字符串')/int(布尔值)
  2. 布尔类型(bool)
    • bool(整型)/bool('字符串')/bool(列表)/bool(元组)
    • 注:只有0,"",[],()转换成布尔是False,其余的都是True
  3. 字符串(str)
    • str(整型)/str(布尔值)
    • 要将列表/元组转换成字符串,可以用join
    • 注意:"".join([元素必须是字符串,元素必须是字符串])
users = ['张三','李四']
val = "".join(users)   
print(val)     #'张三李四'
  1. 列表(list)
    • list(元组)
    • list((11,22,33)) #[11,22,33]
  2. 元组(tuple)
    • tuple(列表)
    • tuple([11,22,33]) #(11,22,33)
  3. 总结(常见数据类型转换):
    • 字符串转数字
    • 数字转字符串
    • 列表转元组
    • 元组转列表
    • 其他转布尔
      • 只有None,0,"",[],(),{},set()转换成布尔是False,其余的都是True

3.12 数据类型表示空

  1. 补充数据类型:None
    • None就是python中的空
    • None转化为布尔为False
    • None无任何功能,专门用于提供空值
  2. 数据类型表示空
    • None
    • int:v1 = int() #0
    • bool:v2 = bool() #False
    • str:v3 = "" 或 v3 = str()
    • list:v4 = [] 或 v4 = list()
    • tuple:v5 = () 或 v5 = tuple()
    • dict:v6 = {} 或 v6 = dict()
    • set:v7 = set()

3.13 判断是否有敏感字符

  1. 字符串(str)
v = 'python全栈21期'
if '全栈' in v:
    print('包含敏感字符')
  1. 列表(list)/元组(tuple)
v = ['alex','oldboy','张三','李四']
if '李四' in v:
    print('包含敏感字符')
#元组(tuple)同理
  1. 字典(dict)
v = {'k1':'v1','k2':'v2','k3':'v3'}
#默认按照键判断,即判断x是否是字典中的键
if 'x' in v:   
    pass

#问题1:判断k1是否在v中?
v = {'k1':'v1','k2':'v2','k3':'v3'}
if 'k1' in v:
    pass

#问题2:判断v2是否在v中?
#方法1:循环判断
v = {'k1':'v1','k2':'v2','k3':'v3'}
flag = '不存在'
for v in v.values():
    if v == 'v2':
        flag = '存在'
print(flag)
#方法2:
#强制转换成列表[v1,v2,v3]
if 'v2' in list(v.values()):
    print('存在')

#问题3:判断k2:v2是否在v中?
value = v.get('k2')
if value == 'v2':
    print('存在')
else:
    print('不存在')
    
示例:判断用户输入内容是否有敏感字符
char_list = ['张三','李四','王五']     #敏感字符
content = input('请输入内容:')
flag = True
for i in char_list:
    if i in content:
        flag = False
        break
if flag:
    print(content)
else:
    print('包含敏感字符')

3.14 内存相关

  1. 列表(list)/字典(dict)/集合(set)

    • 情况一:

      v1 = [1,2,3]
      v2 = v1
      v1.append(4)      #增加
      print(v2)      #[1,2,3,4]
      #在v1里面修改(增加/删除),v2也跟着改变
      • 修改内存中的元素,所有指向那个内存的值都会改变
    • 情况二:

      v1 = [1,2,3]
      v2 = v1
      v1 = [3,4,5]      #重新赋值
      print(v2)     #[1,2,3]
      #重新赋值v1,v2不改变
      • 重新赋值不修改内存中的元素,只改变值的指向
  2. 字符串(str)/元组(tuple)

    • 只有情况二,只能重新赋值,不能修改
  3. 总结

    • 在python中,为了提高性能,值若是以下情况(python小数据池),就不重新开辟内存

      • 常用数字:-5~256
      • 简单字符串:如'alex',除去 'alex' * 3(数字大于1) 这种情况
    • == 比较的是值是否相等,is 比较的是内存地址是否相等

      #例1:
      v1 = [1,2]
      v2 = [1,2]
      v1 == v2      #True
      v1 is v2      #False
      
      #例2:
      v1 = [1,2]
      v2 = v1
      v1 == v2      #True
      v1 is v2      #True
      • 注:python小数据池除外

3.15 深浅拷贝

  1. 基本格式

    v1 = [1,2,3]
    import copy       
    v2 = copy.copy(v1)             #浅拷贝
    v3 = copy.deepcopy(v1)         #深拷贝
  2. 整型int/布尔bool/字符串str(不可变类型)

    • 深拷贝和浅拷贝的结果都是一样的
    • 无法重新开辟一个内存地址,就使用同一个地址
    • 1554358957881
  3. 列表list/字典dict/集合set(不可变类型)

    • 对于其中的元素都是不可变类型时,深拷贝和浅拷贝的结果都是一样的,都是只拷贝第一层
    • 1554359021070
    • 对于其中元素存在可变类型时,浅拷贝只拷贝第一层,深拷贝要拷贝所有的可变类型
    • 1554359113975
  4. 特殊类型:元组tuple

    • 如果元组中不含有可变类型,同理字符串的深浅拷贝
    • 如果元组中含有可变类型,同理列表的深浅拷贝
  5. 总结

    • 浅拷贝:只拷贝第一层

      深拷贝:拷贝嵌套层次中的所有可变类型

    • 深拷贝之所以不拷贝不可变类型,是由于python小数据池的缘故

    • 注意:

      • 拷贝只针对可变类型:再创造一份
      • 不可变类型:不会拷贝(不再创造一份出来,都是用同一个地址)

第四章 文件操作

4.1 文件基本操作

# 打开文件
f = open('要打开的文件路径',mode='r/w/a',encoding='文件原来写入时定义的编码')

# 操作
# f.write()
# f.read()
data = f.read()  # 读取文件的内容到内存(全部)
f.write('要写入的内容')

# 关闭文件
f.close()
# 示例一 : 一般用于文字写入。
f = open('a.txt',mode='w',encoding='utf-8')
# a. 将 “你好” 根据encoding指定的编码转换成: 
#       “你好” --> 10001000 10001000 10001000 10001000 10001000 10001000
# b. 将二进制写入到文件中。
f.write('你好') # w打开文件,则write传入字符串
f.close()

# 示例二:一般用于图片/音频/视频/未知编码 
f = open('a.txt',mode='wb')
# 1. 把要写入的字符串转换成二进制
data = "我好困"
content = data.encode('utf-8') # 将字符串按照utf-8编码转换成二进制
# 2. 再将二进制写到文件中
f.write(content) # wb打开文件,则write传入的是 二进制
f.close()

4.2 打开模式

  • r / w / a:只读只写字符串

  • r+ / w+ / a+:可读可写字符串

  • rb / wb / ab:只读只写二进制

    • 字符串转换成二进制

      v = 字符串
      date = v.encode('utf-8')
    • 二进制转换成字符串

      v = 二进制
      date = v.decode('utf-8')
  • r+b / w+b / a+b :可读可写二进制

4.3 操作

  • read() , 全部读到内存

  • read(1)

    • 1表示一个字符

      obj = open('a.txt',mode='r',encoding='utf-8')
      data = obj.read(1) # 1个字符
      obj.close()
      print(data)
    • 1表示一个字节

      obj = open('a.txt',mode='rb')
      data = obj.read(3) # 1个字节
      obj.close()
  • write(字符串)

    obj = open('a.txt',mode='w',encoding='utf-8')
    obj.write('中午你')
    obj.close()
  • write(二进制)

    obj = open('a.txt',mode='wb')
    # obj.write('中午你'.encode('utf-8'))
    v = '中午你'.encode('utf-8')
    obj.write(v)
    obj.close()
  • seek(光标字节位置),无论模式是否带b,都是按照字节进行处理。

    obj = open('a.txt',mode='r',encoding='utf-8')
    obj.seek(3) # 跳转到指定字节位置
    data = obj.read()
    obj.close()
    print(data)
    
    obj = open('a.txt',mode='rb')
    obj.seek(3) # 跳转到指定字节位置
    data = obj.read()
    obj.close()
    print(data)
  • tell(), 获取光标当前所在的字节位置

    obj = open('a.txt',mode='rb')
    # obj.seek(3) # 跳转到指定字节位置
    obj.read()
    data = obj.tell()
    print(data)
    obj.close()
  • flush,强制将内存中的数据写入到硬盘

    v = open('a.txt',mode='a',encoding='utf-8')
    while True:
        val = input('请输入:')
        v.write(val)
        v.flush()
    v.close()

4.4 关闭文件

  • 基本方式
v = open('a.txt',mode='a',encoding='utf-8')
v.close()
  • 便捷方式
with open('a.txt',mode='a',encoding='utf-8') as v:
    data = v.read()
    # 缩进中的代码执行完毕后,自动关闭文件

4.5 文件内容的修改

  • 小文件修改
with open('a.txt',mode='r',encoding='utf-8') as f1:
    data = f1.read()
new_data = data.replace('飞洒','666')

with open('a.txt',mode='w',encoding='utf-8') as f1:
    data = f1.write(new_data)
  • 大文件修改
f1 = open('a.txt',mode='r',encoding='utf-8')
f2 = open('b.txt',mode='w',encoding='utf-8')
for line in f1:
    new_line = line.replace('阿斯','死啊')
    f2.write(new_line)
f1.close()
f2.close()
with open('a.txt',mode='r',encoding='utf-8') as f1, open('c.txt',mode='w',encoding='utf-8') as f2:
    for line in f1:
        new_line = line.replace('阿斯', '死啊')
        f2.write(new_line)

第五章 函数

5.1 函数的本质及应用场景

截至目前:面向过程编程(可读性差/可重用性差)

对于函数编程:

  1. 本质:将N行代码拿到别处并给他起一个名字,以后通过名字就可以找到这段代码并执行

  2. 应用场景:
    • 代码重复执行
    • 代码特别多超过一屏,可以选择通过函数进行代码的分割
# 面向过程编程 
user_input = input('请输入角色:')

if user_input == '管理员':    
    import smtplib    
    from email.mime.text import MIMEText    
    from email.utils import formataddr
    msg = MIMEText('管理员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')    
    msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])    
    msg['To'] = formataddr(["管理员", '344522251@qq.com'])    
    msg['Subject'] = "亲爱的管理员"
    
    server = smtplib.SMTP("smtp.163.com", 25)           
    server.login("15776556369@163.com", "qq1105400511")          
    server.sendmail('15776556369@163.com', ['管理员', ], msg.as_string())
    server.quit() 
    
elif user_input == '业务员':    
    import smtplib    
    from email.mime.text import MIMEText    
    from email.utils import formataddr
    msg = MIMEText('业务员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')    
    msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])    
    msg['To'] = formataddr(["业务员", '业务员'])    
    msg['Subject'] = "亲爱的业务员"
    
    server = smtplib.SMTP("smtp.163.com", 25)    
    server.login("15776556369@163.com", "qq1105400511")   
    server.sendmail('15776556369@163.com', ['业务员', ], msg.as_string())    
    server.quit() 
    
elif user_input == '老板':    
    import smtplib    
    from email.mime.text import MIMEText    
    from email.utils import formataddr
    
    msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')    
    msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])    
    msg['To'] = formataddr(["老板", '老板邮箱'])    
    msg['Subject'] = "亲爱的老板"
    
    server = smtplib.SMTP("smtp.163.com", 25)    
    server.login("15776556369@163.com", "qq1105400511")    
    server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string())    
    server.quit()
#函数式编程
#先不考虑是否能执行,单纯为了比较函数式编程与面向过程编程的区别
def send_email():    
    import smtplib    
    from email.mime.text import MIMEText    
    from email.utils import formataddr
    
    msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')    
    msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])    
    msg['To'] = formataddr(["老板", '老板邮箱'])    
    msg['Subject'] = "情爱的老板"
    
    server = smtplib.SMTP("smtp.163.com", 25)    
    server.login("15776556369@163.com", "qq1105400511")    
    server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string())
    server.quit()

user_input = input('请输入角色:')
if user_input == '管理员':    
    send_email() 
elif user_input == '业务员':    
    send_email() 
elif user_input == '老板':    
    send_email()

5.2 函数定义

  1. 基本定义函数
def 函数名():       #函数的定义
    代码            #函数内容
    
函数名()            #函数的执行
"""
注意:1.函数如果不被调用,则内部代码永远不会被执行
     2.len(计算长度)是python内部写好的一个函数
"""
  1. 参数(个数不限制)
def get_list_date(aaa):       #aaa:形式参数(形参)
    v = [11,22,33,44]
    print(v[aaa])
    
get_list_date(1)             #1:实际参数(实参)
  • 发送邮件问题

    # 假如:管理员/业务员/老板用的是同一个邮箱。 
    """
    def send_email(to):    
        import smtplib    
        from email.mime.text import MIMEText    
        from email.utils import formataddr
    
        msg = MIMEText('导演,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')    
        msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])    
        msg['To'] = formataddr(["导演", to])    
        msg['Subject'] = "情爱的导演"
    
        server = smtplib.SMTP("smtp.163.com", 25)    
        server.login("15776556369@163.com", "qq1105400511")  
        server.sendmail('15776556369@163.com', [to, ], msg.as_string())    
        server.quit() 
    """ 
    
    def send_email(to):    
        template = "要给%s发送邮件" %(to,)    
        print(template)
    
    user_input = input('请输入角色:')
    if user_input == '管理员':    
        send_email('xxxx@qq.com') 
    elif user_input == '业务员':    
        send_email('xxxxo@qq.com') 
    elif user_input == '老板':    
        send_email('xoxox@qq.com')
  • 练习题

    # 1. 请写一个函数,函数计算列表 info = [11,22,33,44,55] 中所有元素的和。
    def get_sum():
        info = [11,22,33,44,55]
        data = 0
        for item in info:
            data += item
        print(data)
    
    get_sum()
    
    # 2. 请写一个函数,函数计算列表中所有元素的和。
    def get_list_sum(a1):
          data = 0
        for item in a1:
            data += item
          print(data)
    
    get_list_sum([11,22,33])
    get_list_sum([99,77,66])
    v1 = [8712,123,123]
    get_list_sum(v1)
    
    # 3. 请写一个函数,函数将两个列表拼接起来。
    def join_list(a1,a2):
        result = []
        result.extend(a1)
        result.extend(a2)
        print(result)
    
    join_list([11,22,33],[55,66,77]
    
    # 4. 计算一个列表的长度
    def my_len(arg):
      count = 0
      for item in arg:
              count += 1
      print(count)
    
    v = [11,22,33]
    my_len(v)
    len(v)
    
    # 5. 发邮件的示例        
    def send_email(role,to):
        template = "要给%s%s发送邮件" %(role,to,)
        print(template)
    
    user_input = input('请输入角色:')
    if user_input == '管理员':
        send_email('管理员','xxxx@qq.com')
    elif user_input == '业务员':
        send_email('业务员','xxxxo@qq.com')
    elif user_input == '老板':
        send_email('老板','xoxox@qq.com')
  1. 返回值(return)
def func(arg):
    代码             #函数内容
return 9             #返回值为9,默认:return None

val = func('ads')    #设置一个变量接收返回值
  • 练习题

    # 1. 写函数,计算一个列表中有多少个数字,打印: 列表中有%s个数字。
    #    提示:type('x') == int 判断是否是数字。
    # 方式一:
    def get_list_counter1(data_list):
        count = 0
        for item in data_list:
            if type(item) == int:
                count += 1
      msg = "列表中有%s个数字" %(count,)
        print(msg)
    
    get_list_counter1([1,22,3,'alex',8])
    
    # 方式二:
    def get_list_counter2(data_list):
        count = 0
        for item in data_list:
            if type(item) == int:
                count += 1
      return count
    
    v = get_list_counter1([1,22,3,'alex',8])
    msg = "列表中有%s个数字" %(v,)
    print(msg)
    
    # 2. 写函数,计算一个列表中偶数索引位置的数据构造成另外一个列表,并返回。
    # 方式一:
    def get_data_list1(arg):
        v = arg[::2]
        return v
    
    data = get_data_list1([11,22,33,44,55,66])
    
    # 方式二:
    def get_data_list2(arg):
        v = []
        for i in range(0,len(arg)):
          if i % 2 == 0:
              v.append(arg[i])
          return v
    
    data = get_data_list2([11,22,33,44,55,66])
    
    # 3. 读取文件,将文件的内容构造成指定格式的数据,并返回。
    """
    a.log文件
        alex|123|18
        eric|uiuf|19
        ...
    目标结构:
    a.  ["alex|123|18","eric|uiuf|19"] 并返回。
    b. [['alex','123','18'],['eric','uiuf','19']]
    c. [
      {'name':'alex','pwd':'123','age':'18'},
      {'name':'eric','pwd':'uiuf','age':'19'},
     ]
    """
    def a():
        info = []
        with open('a.log',mode='r',encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                info.append(line)
        return info
    
    def b():
        info = []
        with open('a.log',mode='r',encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                v = line.split('|')
                info.append(v)
        return info
    
    def c():
        info = []
        with open('a.log',mode='r',encoding='utf-8') as f:
            for line in f:
                line = line.strip()
                list = line.split('|')
                v = {}
                v['name'] = list[0]
                v['pwd'] = list[1]
                v['age'] = list[2]
                info.append(v)
        return info
    
    date1 = a()
    date2 = b()
    date3 = c()
    print(date1,date2,date3)
  1. 总结
#函数的基本结构:
#情况一
def f1():
    函数内容
    
f1()

#情况二
def f2(a):
    函数内容
    
f2(1)

#情况三
def f3():
    函数内容
    return 1

v1 = f3()

#情况四
def f4(a1,a2):
    函数内容
    return a1+a2

v2 = f4(1,7)

第六章 模块

第七章 面向对象

第八章 网络编程

第九章 并发编程

第十章 数据库

第十一章 前端开发

第十二章 Django框架

附录 常见错误和单词

单词

单词 含义 补充
print 输出
input 输入
True 正确 布尔值
False 错误 布尔值
pass 跳过,通过
break 终止
continue 继续
if / elif 如果 条件语句
else 其他
while 当......的时候 while循环
for for循环
upper 小写变为大写 字符串方法
lower 大写变为小写 字符串方法
isdecimal 判断是否为数字 字符串方法:isdigit类似
strip / rstrip / lstrip 去空格/去换行符/去制表符/去除指定的字符串 字符串方法
replace 替换 字符串方法
split / rsplit 切割 字符串方法
len 计算长度 公共功能
startswith / endswith 判断是否已......开头/结尾 字符串方法
format 字符串格式化 字符串方法
encode 将unicode转换成其他编码存储 字符串方法
join 循环每个元素,并在元素和元素之间加入连接符 字符串方法
range 用于for循环
append 追加 列表方法
insert 插入 列表方法
remove 删除(指定元素) 列表方法
pop 删除(索引位置的元素) 列表方法,字典方法
clear 删除全部 列表方法
del 删除 公共功能
extend 循环加入 列表方法
keys 获取字典中的所有键 字典方法
values 获取字典中的所有值 字典方法
items 获取字典中的所有键值对 字典方法
reverse 反转 列表方法
sort 排序 列表方法
get 相当于索引取值 字典方法
update 批量添加(修改):不存在则添加,存在则修改 字典方法,集合方法
add 添加 集合方法
discard 删除 集合方法
intersection 交集 集合方法
union 并集 集合方法
different 差集 集合方法
symmetric_different 对称差集 集合方法
def 函数
return 返回值 函数中使用

错误记录

  1. 缩进错误

  2. 键错误

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!