Pythonの崎岖的进阶之路,Week_Two - Python基础

 学习目录

1. 数据类型

2. 列表操作

3. 元祖操作

4. 字符串操作

5. 字典操作

6. 集合操作

7. 文件操作

一、数据类型

  Python中变量不需要声明,但是变量在创建时必须赋值

  在Python中变量没有数据类型,我们所说的"类型"是变量所指的内存中对象的类

Python中有六种标准数据类型

1. 不可变数据类型

  • Number(数字)
  • String(字符串)
  • Tuple(元组)

2. 可变数据类型

  • Set(集合)
  • Dictionary(字典)
  • List(列表)

Number

Python3支持 int、float、bool、complex(复数)

使用type函数类获取参数的数据类型:

>>>a, b, c, d = (7, 5.2, True, 2e3)
>>>print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'float'>

String

Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。

>>>str = "abcdefg"
>>>print(str)
abcdefg

二、列表操作

列表数据类型是最常用的,可以通过操作列表实现对数据的存储、修改等操作

定义列表

names_list = ['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili']

列表切片

      通过列表下标访问列表中参数,下表从0开始

>>> names_list[0]
'gupeng'
>>> names_list[-1]
'lili'
>>> names_list[-2]
'Lucy'

      取多个参数 

>>> names_list[1:3]    # 左闭右开,左侧包含开始位, 右侧不包含结束位
['zhanglei', 'DeLi']
>>> names_list[1:-1]   # 左闭右开,右侧不包括-1
['zhanglei', 'DeLi', 'Lucy']
>>> names_list[-4:-1]  
['zhanglei', 'DeLi', 'Lucy']
>>> names_list[:3]     # 如果从头开始取到某一位,0可以省略
['gupeng', 'zhanglei', 'DeLi']
>>> names_list[0:]     # 如果一直取到最后一位,最后一位可以省略
['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili']
>>> names_list[:]      # 取全部参数 效果等同names_list
['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili']
>>> names_list[::2]    # 所有参数,2代表步长,即每隔一位取一个数
['gupeng', 'DeLi', 'lili']  
>>> names_list[0:3:2]  # 从0到3,每隔一位取一个 效果等于names_list[:3:2]
['gupeng', 'DeLi']

      追加

>>> names_list
['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili']
>>> names_list.append("mumu")
>>> names_list
['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili', 'mumu']

  插入

>>> names_list
['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili', 'mumu']
>>> names_list.insert(2, "Judy")    # 2标识插入位置,“Judy”是要插入的参数
>>> names_list
['gupeng', 'zhanglei', 'Judy', 'DeLi', 'Lucy', 'lili', 'mumu']

  修改

>>> names_list
['gupeng', 'zhanglei', 'Judy', 'DeLi', 'Lucy', 'lili', 'mumu']
>>> names_list[2]="Nick"    # 使用下标直接修改
>>> names_list
['gupeng', 'zhanglei', 'Nick', 'DeLi', 'Lucy', 'lili', 'mumu']

  删除

>>> names_list
['gupeng', 'zhanglei', 'Nick', 'DeLi', 'Lucy', 'lili', 'mumu']
>>> names_list.remove("mumu")    # 使用remove方法删除指定参数
>>> names_list
['gupeng', 'zhanglei', 'Nick', 'DeLi', 'Lucy', 'lili']
>>> del names_list[1]            # 使用del方法通过下标删除
>>> names_list
['gupeng', 'Nick', 'DeLi', 'Lucy', 'lili']
>>> names_list.pop()             # pop() 抛出最后一个参数
'lili'
>>> names_list
['gupeng', 'Nick', 'DeLi', 'Lucy']
>>> names_list.pop(1)            # pop()通过下标删除指定参数
'Nick'
>>> names_list
['gupeng', 'DeLi', 'Lucy']

  获取下标

>>> names_list = ['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili']
>>> names_list.index("Lucy")
3

  计数

>>> names_list = ['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili', 'DeLi']
>>> names_list.count("DeLi")
2

  翻转

>>> names_list.reverse()
>>> names_list
['DeLi', 'lili', 'Lucy', 'DeLi', 'zhanglei', 'gupeng']

  排序

>>> names_list = ['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili', 'DeLi']
>>> names_list.sort()    # 按字母顺序排序
>>> names_list
['DeLi', 'DeLi', 'Lucy', 'gupeng', 'lili', 'zhanglei']
>>> names_list = ['gupeng', 'zhanglei', '2DeLi', '1Lucy', '$$lili', 'DeLi','Zhangge']
>>> names_list.sort()    # 特殊字符> 数字 > 大写> 小写
>>> names_list
['$$lili', '1Lucy', '2DeLi', 'DeLi', 'Zhangge', 'gupeng', 'zhanglei']

  扩展

>>> names_list = ['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili']
>>> names2=[1,2,3,4]
>>> names_list.extend(names2)
>>> names_list
['gupeng', 'zhanglei', 'DeLi', 'Lucy', 'lili', 1, 2, 3, 4]

  拷贝(浅copy)

>>> names1 = ['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili']]
>>> names2 = names1.copy()    # 浅copy
>>> names2
['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili']]
>>> names1[2].append('mumu')
>>> names1
['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili', 'mumu']]
>>> names2
['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili', 'mumu']]

  深度copy

>>> import copy
>>> names1 = ['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili']]
>>> names2 = copy.deepcopy(names1)
>>> names1, names2
(['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili']],
 ['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili']])
>>> names1[2].append("mumu")
>>> names1, names2
(['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili', 'mumu']],
 ['gupeng', 'zhanglei', ['DeLi', 'Lucy', 'lili']])

解析赋值引用、浅copy、深copy

1. b = a: 赋值引用,a 和 b 都指向同一个对象。

 

 

 2. b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象

 

 

 3. b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

三、元组操作

 元组与列表类似,但是元组一旦创建就不允许修改,所以又叫只读列表

names = ('DeLi', 'lili', 'Lucy', 'DeLi', 'zhanglei', 'gupeng')

  元组只有两种方法,分别为count和index

>>> names = ('DeLi', 'lili', 'Lucy', 'DeLi', 'zhanglei', 'gupeng')
>>> names.count("DeLi")
2
>>> names.index("Lucy")
2

四、字符串操作

# -*- coding: utf-8 -*-

name = "my name is boxiaomu"

print(name.capitalize())    # 首字母大写
print(name.count("o"))      # 统计
print(name.center(50, "_"))
print(name.endswith("mu"))     # 判断字符串以什么结尾

name = "my  \t name is boxiaomu"
print(name.expandtabs(tabsize=30))    # tab键转成tabsize个空格

print(name.find("name"))    # 找到开头字符索引(字符串也可以切片)
print(name[name.find("name"):9])    # 字符串切片

name = "my name is {name} and i am {year} old "
print(name.format(name="boxiaomu", year=18))
print(name.format_map( {'name':'boxiaomu', 'year':'18'} ))

print(name.isalnum())    # 是否是阿拉伯数字和字符

print('a1A'.isidentifier())    # 判断是否是合法标识符
print(name.lower())    # 是否小写
print('33.33'.isnumeric())  # 判断是否是数字

print('1A'.isdigit())    # 是否是整数 常用

# join
print('+'.join(['1','2','3'] ) )

print(name.ljust(50,'*'))   # 末尾补齐
print(name.rjust(50, '$'))
print('BOXIAOMU'.lower())
print('boxiaom'.upper())
print('\nBoxiaomu'.lstrip())    # 去掉左回车
print('\nBoxiaomu'.lstrip())    # 去掉右回车
print('   Boxioam\n'.strip())   # 去掉回车、空格

p = str.maketrans('abcdwef', '1234567')     # 把字符串改成后边的数字(类似加密)
print('boxiaomu'. translate(p))

print('boxioamu'.replace('o', 'O', 1))
print('boxiao mu'.split())  # 字符串按空格分成列表
print('1+2+3+4'.split('+'))
print('1+2\n+3+4'.splitlines())
print('Yanru bo'.swapcase())    # 大小写翻转
print('xiaomu bo'.title())
print('xiaomu bo'.zfill(50))

  运行结果

My name is boxiaomu
2
_______________my name is boxiaomu________________
True
my                             name is boxiaomu
6
nam
my name is boxiaomu and i am 18 old 
my name is boxiaomu and i am 18 old 
False
True
my name is {name} and i am {year} old 
False
False
1+2+3
my name is {name} and i am {year} old ************
$$$$$$$$$$$$my name is {name} and i am {year} old 
boxiaomu
BOXIAOM
Boxiaomu
Boxiaomu
Boxioam
2oxi1omu
bOxioamu
['boxiao', 'mu']
['1', '2', '3', '4']
['1+2', '+3+4']
yANRU BO
Xiaomu Bo
00000000000000000000000000000000000000000xiaomu bo

五、字典操作

  查询操作

# key-value key尽量不写中文
>>> info = {
...     'stu1101':'xiaomu bao',
...     'stu1102': 'Shirley Yang',
...     'stu1103': 'shagua ce',
... }
>>> info['stu1101']  # 不存在则报错
'xiaomu bao'
使用get查询 >>> info.get('stu1101') 'xiaomu bao' >>> info.get('stu1100') # 不存在不报错 setdefault()方法 >>> info.setdefault('stu1101', 'name') 'TengLan wu' >>> info {'stu1101': 'TengLan wu', 'stu1102': 'LongZe luala', 'stu1103': 'XiaoZe Mliya'} >>> info.setdefault('stu1104','zhuli ye') 'zhuli ye' >>> info {'stu1101': 'TengLan wu', 'stu1102': 'LongZe luala', 'stu1103': 'XiaoZe Mliya', 'stu1104': 'zhuli ye'}
key in dict方法查询 >>> 'stu1004' in info 不存在返回False False >>> 'stu1101' in info 存在返回True True

  修改操作

>>> info
{'stu1101': 'xiaomu bao', 'stu1102': 'Shirley Yang', 'stu1103': 'shagua ce'}
>>> info['stu1101'] = 'muzi li'  
>>> info
{'stu1101': 'muzi li', 'stu1102': 'Shirley Yang', 'stu1103': 'shagua ce'}    # 字典中存在该键 则对该键值进行修改
>>> info['stu1104'] = 'doctor chen'   # 字典中不存在该键, 则增加
>>> info
{'stu1101': 'muzi li', 'stu1102': 'Shirley Yang', 'stu1103': 'shagua ce', 'stu1104': 'doctor chen'}    

  删除操作

>>> info
{'stu1101': 'muzi li', 'stu1102': 'Shirley Yang', 'stu1103': 'shagua ce', 'stu1104': 'doctor chen'}
>>> del info['stu1104']  # 通用del删除方法
>>> info
{'stu1101': 'muzi li', 'stu1102': 'Shirley Yang', 'stu1103': 'shagua ce'}
>>> info.pop('stu1103')  # 删除指定键值对
'shagua ce'
>>> info
{'stu1101': 'muzi li', 'stu1102': 'Shirley Yang'}
>>> info.popitem()  # 删除最后一个键值对
('stu1102', 'Shirley Yang')
>>> info
{'stu1101': 'muzi li'}

  多字典操作

## update 方法 合并两个字典,交叉覆盖,没有则创建
>>> b = {
...     'stu1101': 'alex',
...     1: 3,
...     2: 5
... }
>>> info.update(b)
>>> info
{'stu1101': 'alex', 'stu1102': 'LongZe luala', 'stu1103': 'XiaoZe Mliya', 'stu1104': 'zhuli ye', 1: 3, 2: 5}

  初始化字典

>>> dic = dict.fromkeys([6,7,8], 'test')
>>> dic
{6: 'test', 7: 'test', 8: 'test'}
>>> dic1 = dict.fromkeys([4,5,6],['a',{'name':'Judy'},333])
>>> dic1
{4: ['a', {'name': 'Judy'}, 333], 5: ['a', {'name': 'Judy'}, 333], 6: ['a', {'name': 'Judy'}, 333]}

  循环字典

info = {
    'stu1101': 'xiaomu bao',
    'stu1102': 'Shirley Yang',
    'stu1103': 'shagua ce',
}

for i in info:
    print(i, info[i])

for k, v in info.items():   # 效率低于上面
    print(k, v)

  字典转列表

>>> info.items()
dict_items([('stu1101', 'xiaomu bao'), ('stu1102', 'Shirley Yang'), ('stu1103', 'shagua ce')])

六、集合操作

  集合是一个无序的,参数不重复的数据组合

list_1 = [1,4,5,7,3,6,7,9]
list_1 = set(list_1)    # 集合是无序的 去重
list_2 = set([2, 6, 0, 66, 22, 8, 4])

  关系测试

# 取交集
>>> list_1.intersection(list_2)
{4, 6}
>>> list_1 & list_2
{4, 6}

# 取并集
>>> list_1.union(list_2)
{0, 1, 2, 3, 4, 5, 6, 7, 66, 9, 8, 22}  
>>> list_1 | list_2
{0, 1, 2, 3, 4, 5, 6, 7, 66, 9, 8, 22}

# 取差集 in list_1 but not in list_2
>>> list_1.difference(list_2)
{1, 3, 5, 7, 9}
>>> list_1 - list_2
{1, 3, 5, 7, 9}

# 对称差集
>>> list_1.symmetric_difference(list_2)    # 两个中互相都没有的
{0, 1, 2, 66, 3, 5, 8, 7, 9, 22}
>>> list_1 ^ list_2
{0, 1, 2, 66, 3, 5, 8, 7, 9, 22}

# 判断是否是子集
>>> list_3 = set([1,3,7])
>>> list_3.issubset(list_1)
True
# 判断是否是父集
>>> list_1.issuperset(list_3)
True

# 没有交集返回True
>>> list_2.isdisjoint(list_3)
True

  基本操作

# 添加add
>>> list_1.add(999)
>>> list_1
{1, 3, 4, 5, 6, 7, 999, 9}

# 添加update
>>> list_1.update([888,777,555])
>>> list_1
{1, 3, 4, 5, 6, 7, 999, 9, 777, 555, 888}

# 删除
>>> list_1.remove(1)    # 不存在报错
>>> list_1
{3, 4, 5, 6, 7, 999, 9, 777, 555, 888}
>>> list_1.discard(1)    # 不存在不报错
>>> list_1
{3, 4, 5, 6, 7, 999, 9, 777, 555, 888}
>>> list_1.pop()
3
>>> list_1
{4, 5, 6, 7, 999, 9, 777, 555, 888}

七、文件操作

文件操作流程

1. 打开文件,得到文件句柄,并赋值给一个变量

2. 通过变量对文件进行读写等操作

3. 关闭文件

打开文件方式

  • r:  只读方式打开,默认方式,只能读取文件
  • w:只写方式打开,不可读文件,【文件不存在则创建,存在则删除内容重新写入】
  • a:只追加写方式打开,可读文件,【不存在则创建,存在则在文件末尾开始追加写内容】
# 读取文件 返回整个文件内容
open('yesterday')   # open file
date = open('yesterday', encoding='utf-8').read()   # windows 默认格式gbk,
                                             #python默认utf-8, 不指定编码方式则用gbk打开

# 通过句柄变量read
f = open('yesterday', encoding='utf-8') # 赋给f 文件句柄/内存对象(文件名,字符集,
                                               # 大小,起始位置)
data = f.read()
print(data)  

# 以 “r” 只读方式打开
f = open('yesterday', 'r', encoding='utf-8') 
# 以“w”只写方式打开
f = open('yesterday', 'w', encoding='utf-8')     # 'w'创建新的 把原来的覆盖掉
f.write('天安门前太阳升')      
# 以“a”追加方式打开
f = open('yesterday', 'a', encoding='utf-8')        # 'a' 追加
f.write("\n拉拉拉拉啊啦啦,\n")   
f.close()    # 关闭文件   

 “+”表示同时可读写文件

  • “r+”:可读写文件,【可读,可写,可追加】
  • “w+”:可写读文件
  • “a+”:可读写文件,【可读,可写,可追加】
# 读写(追加)
f = open('yesterday2', 'r+', encoding='utf-8')

# 写读(先创建再写 write都是在最后追加)
f = open('yesterday2', 'w+', encoding='utf-8')

# 追加读
f = open('yesterday2', 'a+', encoding='utf-8')

# 二进制模式读文件
f = open('yesterday2', 'rb')

with语句

为避免文件操作后忘记关闭,可以通过with语句来实现执行完成后,内部自动关闭并释放文件资源

with open("yesterday2", "r", encoding="utf-8") as f:
    pass

with open("yesterday2", "r", encoding="utf-8") as f, \
        open("yesterday2", "r", encoding="utf-8") as f2:     # python3支持
    pass     

循环读取文件,写入内容

# 读到第十行时不打印
for index, line in enumerate(f.readlines()):
    if index == 9:
        print('---')
        continue
    print(line.strip())

# f 迭代器
count = 0
for line in f:
    if count == 9:
        print('------------分割线---------------')
        count +=1
        continue
    print(line.strip())
    count +=1

 使用flush实时刷新到内存

import sys
import time

# 进度条
for i in range(20):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.2)

  

 

posted @ 2020-11-10 17:16  薄小木的自动化进阶之路  阅读(103)  评论(0)    收藏  举报