• 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	"
      print(v2.strip())
      
      v3 = "alex
      "
      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(),将所有文件全部读取到内存中,并且按照 进行切分添加到列表中,需要打印给强制转换一下或者用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)
    
  • 相关阅读:
    IP,子网,子网掩码,网关,DNS到底都是啥(二)
    (能被11整除的数的特征)The shortest problem --hdu
    (匹配 匈牙利)棋盘游戏 -- Hdu --1281
    (匹配)Courses -- hdu --1083
    (匹配 最小路径覆盖)Air Raid --hdu --1151
    (匹配)The Accomodation of Students --HDU --2444
    (匹配)Fire Net --hdu --1045
    (二分匹配 模板)过山车 -- hdu --2063
    (连通图 ) Redundant Paths --POJ --3177
    (二分匹配 模板 KM)奔小康赚大钱--hdu--2255
  • 原文地址:https://www.cnblogs.com/borntodie/p/13560195.html
Copyright © 2020-2023  润新知