Python基础入门

2.1 环境的安装

  • 解释器:py2 / py3(环境变量的配置)
  • 开发工具:pycharm

2.2 编码相关

2.2.1 编码基础

  • ascii:一个英文占一个字节,二进制序列,一共有八位,最大值255(2**8)
  • unicode(万国码):一个英文两个字节,有32 位,现在用到了21位。
  • utf-8:对万国码的压缩,一个英文一个字节,一个中文三个字节。
  • gbk:两个字节表示一个中文
  • gb2312

2.2.2 python编码相关

对于Python默认解释器编码

  • py2:ascii
  • py3:utf-8

如果想要修改默认编码,则可以使用:

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

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

2.3 变量

变量命名的规则

  • 变量名只能包含字母、数字、下划线
  • 不能以数字开头
  • 不能是python里的关键字

变量命名的要求

  • 见名知意
  • 一个单词不能表示变量的意思,可以用多个单词+下划线表示

为什么要有变量?

答:为某个值创建一个‘外号’,方便以后在使用这个值的时候使用。

2.3 数据类型

2.3.1 整型(int)

  • 整型的长度

    • py2中有:int、long
    • py3中有:int
  • 整除

    • py2中,整除结果会自动将小数点后面的数省略
    • py3中,整除结果不会省略小数点后面的数

2.3.2 布尔(bool)

布尔值就是用于表示真假的。True / False

布尔值与其他数据类型之间的转换

  • None、“”、0、{}、[]等空值 -------》False
  • 其余的值全部是True

2.3.3 字符串(str)

字符串是写代码中最常见的,python内存中的字符串是按照:unicode 编码存储。对于字符串是不可变。

字符串自己有很多方法,如:

  • upper():大写

    v = 'ALEX'
    v1 = v.upper()
    print(v1)
    v2 = v.isupper() # 判断是否全部是大写
    print(v2)
    
  • lower():小写

    v = 'alex'
    v1 = v.lower()
    print(v1)
    v2 = v.islower() # 判断是否全部是小写
    print(v2)
    
    
    ############ 了解即可
    v = 'ß'
    # 将字符串变小写(更牛逼)
    v1 = v.casefold()
    print(v1) # ss
    v2 = v.lower()
    print(v2)
    
  • isdecimal():判断是否是数字

    v = '1'
    # v = '二'
    # v = '②'
    v1 = v.isdigit()  # '1'-> True; '二'-> False; '②' --> True
    v2 = v.isdecimal() # '1'-> True; '二'-> False; '②' --> False
    v3 = v.isnumeric() # '1'-> True; '二'-> True; '②' --> True
    print(v1,v2,v3)
    # 以后推荐用 isdecimal 判断是否是 10进制的数。
    
    # ############## 应用 ##############
    
    v = ['alex','eric','tony']
    
    for i in v:
        print(i)
    
    num = input('请输入序号:')
    if num.isdecimal():
        num = int(num)
        print(v[num])
    else:
        print('你输入的不是数字')
    
  • strip():去除前后的空白、制表符、指定字符

    v1 = "alex "
    print(v1.strip())
    
    v2 = "alex\t"
    print(v2.strip())
    
    v3 = "alex\n"
    print(v3.strip())
    
    v1 = "alexa"
    print(v1.strip('al'))
    
  • replace():替换

    v = 'alex'
    v1 = v.replace('a','l')
    print(v1)
    
  • startswith() / endswith():以什么开头 / 结尾。返回True & False

    a = 'knight'
    if a.startswith('k'):        #前几位也可以
    	print(a)                #endswith用法相同    
    
  • encode():编码,将字符串转换成指定类型的编码格式

    v = open(文件路径,mode= 'wb')
    date = 'baibai'
    count = date.encode('utf-8')    #将字符串转二进制按照utf-8输
    v.write(count)
    f.close()
    
  • format():字符串格式化

    name = '我叫:{0},年龄:{1}'.format('bigox',24)
    print(name)
    
  • join():将字符串(列表、元组)按照某种格式连接起来

    name = 'alex' # a_l_e_x 
    result = "**".join(name) # 循环每个元素,并在元素和元素之间加入连接符。 
    print(result)#中间加result输入的东西
    
  • split():字符串切割

    message = "看见一个大傻子,因为不看路,摔死了,他叫塞子."
    # result = message.split(',')       
    # result = message.split(',',1)        从左往右切割  
    
    # result = message.rsplit(',')
    result = message.rsplit(',',1)             从右往左切割
    
    print(result)
    

2.3.4 列表(list)

  • append(字符串):向列表中添加某个元素

    users = [] 
    users.append('Tina') 
    print(users)
    
  • insert(字符串):在列表的某个位置添加某个元素

    v = ['tina','大哥','xiaoxin']
    v.insert(2,'lulu')
    print(v)    #['tina', '大哥', 'lulu', 'xiaoxin']
    
  • remove(列表中的元素):删除列表中的元素

    v = ['tina','大哥','xiaoxin']
    v.remove('tina')
    print(v)    #['大哥','xiaoxin']
    
  • pop(元素索引):删除列表中的元素

    v = ['tina','大哥','xiaoxin']
    v.pop(0)
    print(v)#['大哥','xiaoxin']
    
  • clear():将列表中的全部元素清除

    v = ['tina','大哥','xiaoxin']
    v = v.clear()
    print(v)#[]
    
  • reverse():翻转

    v1 = [1,2,3111,32,13]
    print(v1)#[1, 2, 3111, 32, 13]
    v1.reverse()
    print(v1)#[13, 32, 3111, 2, 1]
    
  • sort():排序

    v1 = [11,22,3111,32,13]
    print(v1)
    
    v1.sort(reverse=False) # 从小到大(默认)[11, 13, 22, 32, 3111]
    v1.sort(reverse=True) # 从大到小[3111, 32, 22, 13, 11]
    print(v1)
    
  • del(按索引删除,可以切片删除)

    a = ['kngiht','kevin','qaz',1,2,3]
    del a[2:4]
    print(a)     #['kngiht', 'kevin', 2, 3] 按索引切片删除
    
  • extend(拼接)

    a = ['kngiht','kevin','qaz',1,2,3]
    a.extend(['wsx','edc'])
    print(a)      #extend一般完成列表与列表的拼接, 如果目标是字符串,则会将字符串拆解拼接
    

     

2.3.5 元组(tuple)

  • 元组不可变,没有什么特殊功能

2.3.6 字典(dict)

  • info / info.keys():获取字典的键

    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    for k in info.keys():
        print(k)
    ----------------------
    for k in info:
        print(k)
    # 两种方式输出的结果是一样的
    
  • info.values():获取字典的值

    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    for v in info.values():
        print(v)
    
  • info.items():获取字典的键和值,以元组格式输出

    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    for pair in info.items():
        print(pair)  #键值对的类型是元组
    ------------------------
    for k,v in info.items():
        prinnt(k,v)
    # 可以用两个变量去接受
    
  • info.get(key):按照键取值

    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    print(info.get(1, 666))
    print(info.get(4, 666))
    # 有key则取出, 没有则返回指定 值
    # 如果没有指定值,则返回 None
    
  • info.pop(key):按照键删除元素(有返回值)

    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    print(info.pop(1)) # henry
    print(info.pop(4)) # None
    
  • info.update(info1):更新字典

    info = {}
    info1 = {1: 'henry', 2: 'echo', 3: 'eliane'}
    info.update(info1) # 将info1中的值更新到info中
    print(info)
    
  • info.setdefalut(ke,value):

    # 查询key,有则取出,没有则添加
    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    info.setdefault(4, 'hello')
    print(info)
    # 取出需要赋值给其他变量
    val = info.setdefault(4, 'i hate you')
    print(val)  # i hate you
    
  • info.popitem()

    # 不能加参数,删除最后一个key值对
    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    v = info.popitem()
    print(v,info)   # v是tuple
    
  • info.clear():清除字典中所有的元素

    # 清空所有元素
    info = {1: 'henry', 2: 'echo', 3: 'eliane'}
    info.clear()
    print(info)
    
  • {}.fromkeys([1,2,3],’uu’)

    #制造新的字典,注意当第二个参数是可变类型的时候,所有的键引用的同一个内存地址
    dic = {}
    dic1 = dic.fromkeys(['a','b','c'],['你好'])
    print(dic1)
    # 结果  {'a': ['你好'], 'b': ['你好'], 'c': ['你好']}
    '''
    fromkeys里第一个参数是可迭代的对象,里边的每个元素就是字典中的健,第二个参数就是值 现在创建的字典中后边的值用的是同一个
    '''
    dic1['a'].append('我好')
    print(dic1)
    # 结果 {'a': ['你好', '我好'], 'b': ['你好', '我好'], 'c': ['你好', '我好']}
    

2.3.7 集合(set)

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

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

方法:

  • add():添加(已有的不再添加)

    v = {1,2,3}
    v.add(4)                 #添加4
    v.add(3)                 #3是已有的,不再添加
    print(v)                 #{1,2,3,4}   
    
  • discard(元素):删除

    v = {1,2,3}
    v.discard(2)             #删除2
    print(v)                 #{1,3}
    
  • update():批量添加

    # 有一样的元素就不再添加
    v = {1,2,3}
    v.update({4,5,6})        #添加4,5,6
    print(v)                 #{1,2,3,4,5,6}
    
  • interxectiom():交集

    v = {1,2,3}
    date = v.intersection({1,3,4})      #取v和{1,3,4}的交集
    print(date)              #{1,3}
    
  • union():并集

    v = {1,2,3}
    date = v.union({1,3,4})             #取v和{1,3,4}的并集
    print(date)              #{1,2,3,4}
    
  • 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}
    
  • symmetric_difference():对称差集

    v = {1,2,3}
    date = v.symmetric_difference({1,3,4})        #取v和{1,3,4}的对称差集
    print(date)              #{2,4}
    

2.3.8 None

  • None就是python中的空
  • None转换成布尔值为False
  • None无任何功能,python中用于提供空值的

2.3.9 数据类型的公共功能

  • 长度:len()

    v = {1,2,'lulu'}
    print(len(v))#3
    
  • 索引

    v = 'alex'
    print(v[2])  # v中的第三位元素
    print(v[-1]) # v中的最后一个元素
    
  • 切片

    v = 'abcdefg'
    print(v[1:3]) # 取第二位到第三位前面的元素
    
  • 步长

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

    v = 'abcdefg'
    for item in v:
        print(item) # 遍历打印v中的每个元素
    
  • 删除:del :可以以切片的方式删除

    #remove,pop和del的区别
    	#remove #根据值删除,不存在则报错
    	# deleted = li.pop(2) #删除列表中指定的一个,另将被删除的数据赋值给deleted
        # del li[2] #仅仅是删除
        # del li[2:4] #del还可以删除列表中指定的一段
    
    # 请删除列表中的第2至第4个元素,并输出删除元素后的列表
    li = ["alex", "WuSir", "ritian", "barry", "wenzhou"]
    del li[1:4]
    print(li)
    

     

注意:集合无索引,无步长,无切片,无删除,无修改

 intboolstrlisttupledictset
len × ×
index × × ×
切片 × × × ×
step × × × ×
for循环/iterable × ×
修改 × × × ×
删除 × × × ×

2.3.10 嵌套

  • 列表嵌套

    #示例:
    users = ['alex',0,True,[11,22,33,'老男孩']]
    users[3]   #[11,22,33,'老男孩']
    users[3][-1]   #'老男孩'
    users[3][-1][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   #正确
    #总结:列表中元素可以被修改和删除,元组中元素不可被修改和删除
    
  • 所有的容器类例如:list,tuple, dict,set 都可以嵌套,但set(), 只能嵌套可hash(int, bool, str, tuple 4种)的数据类型。

2.3.11 数据类型总结

  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'}
    

2.3.12 内存相关(修改还是赋值)

  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
      • 简单字符串:
    • == 比较的是值是否相等,is比较的是内存地址是否一致(python小数据池除外)

      #例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
      

2.4 深浅拷贝

  1. 基本格式

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

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

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

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

    • == 判断值是否相等

    • is判断内存地址是否一致

    • python中默认会对int bool str进行缓存

    • 缓存规则:

      • int型:-5~256之间会被缓存
      • str:空和单个字符默缓存;只包含字母,数字,下划线;乘数大于1时,str只包含Num 、 ALp、时缓存(长度不能超过20位)
  6. 总结

    • 浅拷贝:只拷贝第一层

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

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

    • 注意:

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

2.5 文件操作

2.5.1 文件基本操作

  • 打开:obj = open(‘路径’,mode=’模式‘,encoding=’编码’)

  • 写入:obj.write()

  • 读取:obj.read()

  • 关闭:obj.close()

    # 打开文件
    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()
    

2.5.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 :可读可写二进制

2.5.3 操作方法函数

  1. 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()
        
  2. readlines(),将所有文件全部读取到内存中,并且按照\n进行切分添加到列表中,需要打印给强制转换一下或者用for循环遍历

    obj = open('a.txt',mode='r',encoding='utf-8')
    data = obj.readlines()
    print(list(data))
    -------------------------
    for item in data:
        print(item)
    
  3. readline(),仅读取文件的一行数据

    obj = open('a.txt',mode='r',encoding='utf-8')
    data = obj.readline()
    print(data)
    
  4. write(字符串)

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

    obj = open('a.txt',mode='wb')
    # obj.write('中午你'.encode('utf-8'))
    v = '中午你'.encode('utf-8')
    obj.write(v)
    obj.close()
    
  6. 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)
    
  7. tell()获取光标当前所在的字节位置

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

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

2.5.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()
    	# 缩进中的代码执行完毕后,自动关闭文件
    

2.5.6 文件内容的修改

2.5.6.1 小文件修改

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

with open('b.txt',mode='w',encoding='utf-8') as f1:
    data = f1.write(new_data)

2.5.6.2 大文件修改

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)
posted @ 2020-08-25 16:00  今天捡到一百块钱  阅读(50)  评论(0编辑  收藏  举报