ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python基础7

2022-05-22 01:34:06  阅读:154  来源: 互联网

标签:文件 func 函数 形参 f1 python 基础 str


基础数据类型方法补充

  • str

    • str.capitalize():首字母大写
    • str.swapcase():大小写颠倒
    • str.title():单词首字母大写
    • str.center(length,sub):按照特定长度居中,并且两端用特定字符填充
    • str.find(sub):从左到右,找到第一个匹配字符,返回index,找不到就返回-1
    • str.index(sub):同find差不多,只是它找不到时,报错
    • str.count(sub):计算字符出现的次数
  • tuple

    • 当元组内只有一个元素时,改元素后必须跟逗号,否则改数据不是元组
    • tuple补充方法
      • index同str的index相同
      • count
  • list

    • 在循环列表时,不建议改变列表的大小,因为改变列表的大小会导致数据的挪动,改变元素的索引,导致操作出错或报错

    • list.index():根据元素返回index,找不到就报错

      • l1 = [1,2,3]
        l1.index(1) # 0
        
    • list.count()

    • list.sort():给列表排序(一般是给全数字元素的;列表排序),参数reverse:默认从小排到大,为True时,从大到小

    • list.reversed():翻转列表

    • 列表能相加,【合并两个列表,生成一个新的列表】

      • l1 = [1,2,]
        l1 += [3,4]
        print(l1) # [1,2,3,4]
        
    • 列表能乘数字【使列表内的元素,复制n份】

      • l = [1,2,'蔡学明',[1,2,3]]*2
        print(l)
        print(l[3] is l[-1])
        
      • 记得是复制哦

  • dict

    • 字典在循环时,不能改变字典大小

    • 解决方法:将要改变的键值对的key保留出来,在循环结束时,再逐一改变

      • dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18}
        # 请将字典中所有键带k元素的键值对删除。
        # 方法1
        key_list = []
        for i in dic:
            if 'k' in i:
                key_list.append(i)
        for i in key_list:
            dic.pop(i)
        print(dic)
        
        # 方法二
        for key in list(dic.keys()):
        	if 'k' in key:
        		dic.pop(key)
        

数据类型间的转换问题(想转成什么,就用对应的函数包裹)

  • int <--> str

    • 要注意,字符串要想转成int,字符串内的所有元素必须都得是数字字符

      i = 100
      s = str(i)
      s1 = '123'
      i1 = int(s1)
      
  • int <-->bool

    • 非零即为True,零为False

      i = 0
      print(bool(i)) # False
      
  • bool <--> str

    • 非空字符串就为True,bool转为str毫无意义,就只是多了两个单词

      print(bool(' ')) # True
      
  • str <-->list

    • 一般采用join和split方法【join方法要注意可迭代对象内的元素必须全是字符串】

      s = '1,2,3,4'
      l = s.split(',') # l = ['1','2','3']
      s1 = '+'.join(l) # s1 = '1+2+3'
      
  • list <--> set

    • 一般用于列表去重,不过set是无序的,所有去重后的列表会被打乱

      l = [1,2,3,3]
      l = list(set(l))
      
  • 可以转成False的值

    • {},set(),'',0,None,[],(,)
      

基础数据类型总结

  • 根据数据类型是否可变
    • 可变的:set、list、dict【可变的数据类型的操作方法大多数会直接改变原数据】
    • 不可变的:int、bool、str、tuple【不可变的数据类型的操作方法,大多数会生成一个新的值】
  • 根据数据类型是否有序【就容器数据类型】
    • 有序的:list、str、tuple
    • 无序的:dict【其实dict是有序的,在3.6以上的版本,就是有序的】、set
  • 根据占内存空间的大小【从大到小】
    • dict > list ~= set > tuple>str>int

编码进阶

  • 在内存中,所有的数据都是以Unicode的编码形式存在,但是网络传输和储存时,都不能使用Unicode编码

  • 在应用层时,所有的加载的数据都会解码成Unicode,但存储时,会被编码成各种编码的文件

  • !image

  • 不同编码之间是不能直接识别和转换的,即以Utf-8编码的文件要以Utf-8解码,否则就会乱码,而且utf-8是无法直接转成gbk编码的

  • 在python中有一类特殊的数据类型【byter】:该种数据类型在python程序运行在内存中时,是非Unicode编码的形式存在的。

  • byter是类似的字符串的数据类型,拥有字符串的大部分操作方法

  • 用byter和Unicode作为编码之间互相转换的交换区【主要原因是byter可以从任何形式的编码文件变成Unicode,再从Unicode变成任何编码的byter】

    • 1:将特定编码的文件,用decode方法解码成Unicode
    • 2:将Unicode编码特定的编码文件
    • image
  • 主要使用两个方法

    • 方法一:str.encode('编码方式')

    • 方法二:byter.decode(‘解码方式'')

      • b = b'\xe4\xb8\xad\xe5\x9b\xbd' #一utf-8编码的bytey
        s = b.decode('utf-8') # s = '中国'
        b1 = s.encode('gbk') #b'\xd6\xd0\xb9\xfa'
        
        
    • 注意:解码时,要注意编码是用什么编码的,即编码是什么格式,解码就得是什么格式,否则会出错

文件的操作

  • 文件操作初始

    • 文件操作三个条件
      • 文件路径
      • 文件编码方式
      • 文件打开模式
  • 文件操作三部曲

    • 打开文件

      f = open(路径,encoding=编码方式,mode=打开模式)
      
    • 操作文件

      f.操作方法
      
    • 关闭文件

      f.close()
      
  • 操作详解

    • open是python的内置函数,底层原理是调用操作系统的文件操作接口
    • 路径可以是相对路径,也可以是绝对路径
    • 文件被打开就会一直被加载在内存中,在操作完文件后,必须关闭文件
    • f是文件句柄,是一个变量
  • 文件的打开模式

    • 读模式: r(文本读) 、rb(字节读)

      • f1 = open('路径',encoding='编码方式',mode='r') 
        
      • 默认mode是r,所以如果是mode是r时,可以不写

      • 如果mode是rb时,不用写encoding方法

      • 在该模式下,文件有多种操作方法

        • f1.read(n)【n为读取的字符长度,当模式是rb时就是字节长度,如果不写,就是全读】

          f1.read(n)
          
        • f1.readline()【按行读取文本】

          f1.readline()
          
        • f1.readlinese()【按行读取文本,将每一行读取到一个列表内】

          l =  f1.readlinese()
          
        • for i in f1【以for循环的方式,读取每一行文本,推荐使用,不同一次加载过多文件数据在内存】

          for line in f1:
          	print(line)
          
    • 写模式:w(文本写),wb(字节写)

      • 当mode是wb,不用写编码方式

      • 如果没有该文件就会创建一个新的文件

      • 要注意以w模式下,在打开文件时,第一步就会清空文件内的数据

      • 在w打开的模式下,无论多少次写的操作都不会触发清空,直到以w模式再次打开文件才会

      • 在该模式下只有一种操作方法,往文件内写入数据

        • f1.write()
          
        • f1.writeline() # 其实两者差不多是一种方法,一行写入,和一次性写入,很少使用writeline
          
    • 追加模式:a(文本追加),ab(字节追加)

      • 当mode为ab时,也不用写编码方式
      • 与w模式相同,它也会在文件没有时,创建文件
      • 它也只有写的操作方法,但是它打开文件时,不会清空文件数据
      • 该模式的追加是在文件的尾部追加
    • 其他模式

      • r+:读写模式,不会创建文件,不会清空文件

        • 要注意读写的顺序,必须是先读后写

          with open('文件的其他操作模式',encoding='utf-8',mode='r+') as f1:
              for line in f1:
                  print(line.strip())
              f1.write('\n大傻逼蔡观河')
              f1.writelines('大傻逼')
          
      • w+:写读模式,会创建文件,也会清空文件,所以读写的顺序是,先写将游标跳到最前端后读

        • with open('文件操作的w+操作',encoding='utf-8',mode='w+') as f2:
              f2.write('ashdjasj1')
              f2.seek(0)
              for i in f2:
                  print(i)
              f2.write('你什么')
          
      • a+:追加读写模式,会创建文件,不会清空文件,读写顺序可以随意,但读得先将游标跳到开端

        • with open('文件操作的a+操作',encoding='utf-8',mode='a+') as f2:
              f2.seek(0)
              for i in f2:
                  print(i)
              f2.write('1223')
          
    • 文件操作的其他方法

      • tell():返回文件句柄的游标的所在字节位置
      • seek(n):将游标移动到n的位置,n必须为字节的长度,移动到开头就是seek(0),结尾是seek(0,2)
      • seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
      • flush():将文件更新的数据写入硬盘内
  • 文件操作的先进方法

    • with方法的优点:

      • 不用自己关闭文件,在代码运行过with语句后,一段时间内关闭文件
    • 能一次性打开多个文件

    • 单一文件操作

      with open(路径,编码方式,打开模式) as 变量:
      
    • 多个文件操作【\表示本行未结束,下一行也是本行的延申】

      with open(路径,编码方式,打开模式) as 变量,\
      	with open(路径,编码方式,打开模式) as 变量:
      
  • 文件的改操作

    • 五部曲【备胎改造计划】

      • 1、 打开要修改的文件
      • 2、打开一个备用文件
      • 3、将要修改的文件数据写入备用文件
      • 4、删除原文件
      • 5、将备用文件更名为原文件
    • 上代码

      with open('男女盆友',encoding='utf-8',mode='r') as f1 ,\
          open('男女盆友备胎',encoding='utf-8',mode='w') as f2:
          for line in f1:
              f2.write(line.replace('alex','sb'))
      import os
      os.remove('男女盆友')
      os.rename('男女盆友备胎','男女盆友')
      

函数

  • 函数的初识

    • 函数的作用
      • 减少重复代码,使代码更简洁、可读
      • 实现代码多次复用
      • 以功能为导向实现代码
  • 函数的结构

    • 函数由关键字、函数名、小括号、函数体组成

    • def 函数名():
      	函数体
      
    • def是定义函数的关键字,以该关键字开头,是告诉解释器,接下来的一段代码是函数

    • 函数名其实也是变量,定义函数名的要求与变量相同,但更要求语义化,让人见名知义

    • 小括号内包裹的是函数内预先定义的变量,也叫形参,命名同变量

    • 函数体内写的是函数实现的功能

  • 函数的返回值【return】

    • 关键字:return
    • return的作用:
      • 作用1:结束函数的执行,函数内的代码执行到该行代码时,就会不会往下执行代码
      • 作用2:返回数据
        • 当没有设置return时,返回值默认是None,写了return但是后面没有跟数据,返回值也是None
        • 返回一个数据时,数据类型就是该数据的类型
        • 返回多个数据时,会将多个数据,包裹成元组的数据类型
  • 函数的调用:在函数名后跟小括号,小括号内添加的数据就是实参

  • 函数的参数

    • 函数的参数分两种:实参、形参
    • 实参是在函数调用时,传入给函数使用的数据
    • 形参是在函数定义时,小括号内的变量
  • 实参的传参方式

    • 位置传参:根据形参的位置和个数传入数据

      • 要求:与形参个数一一对应,顺序不能乱,而且不能多不能少
      • 优点:快捷、方便
      • 缺点:如果不记得传入的顺序,会导致函数执行错误
    • 关键字传参:根据要传入的形参的变量名,一一对应传入参数

      • 要求:也要求一一对应,但顺序没要求
      • 缺点:麻烦
      • 优点:数据顺序可以乱
    • 混合传参:可以将位置传参和关键字传参混合传参

      • 要求:位置参数必须在关键字参数前,不能重复传参
      • 优点:灵活的传入参数
      • 缺点:暂时没有
    • def func(key,key2):
      	pass
      func(value,value) # 位置传参
      func(key=value,key2=value2) #关键字传参
      func(value,key2=value1) #混合传参
      
  • 形参的定义方式

    • 位置形参:能接收位置参数和关键字参数

      • def func(变量,变量1):
        	pass
        func(value,value)
        
    • 默认参数形参:在函数定义形参变量时就赋予默认值,函数调用时可以不传入该参数,如果传入就覆盖该默认值

      • def func(变量=value):
        	pass
        func()
        
    • 万能位置形参:进阶的位置形参,贪婪原则,尽可能的接收位置参数,使函数能接收更多的位置参数

      • def func(*args):
        	pass
        func(value,value1,value2,value3)
        
    • 万能关键字形参:贪婪原则,尽可能的接收关键字参数

      • def func(**kwargs):
        	pass
        func(name=value,age=value,sex=value)
        
    • 仅限关键字形参

      • 位置处于万能位置形参和万能关键字形参之间

      • 只能以关键字传参的方式传入数据

      • def func(*args,变量,**kwargs):
        	pass
        func(变量 = value)
        
  • 关于函数形参定义的顺序

    • 普通位置形参 > 万能位置形参 >默认形参 and 仅限关键字形参 >万能关键字形参

    • def func(a,*args,sex='男',b,**kwargs):
      	pass
      
  • 关于函数传参顺序

    • 位置参数 >关键字参数
  • 关于*的应用

    • 在函数定义时
      • 定义万能位置形参:聚合作用,将接收的位置参数,聚合成一个元组
      • 在定义万能关键字形参:聚合作用,将接收到的关键字参数,聚合成一个以关键字为key,值为value的字典
    • 在函数调用时
      • 一个*,代表打散一个可迭代对象,将一个个元素作为位置参数传入给函数
      • 两个*,代表打散一个字典,将一对对键值作为关键字参数传入给函数

名称空间

  • 什么是名称空间
    • 在py代码开始执行时,创建的以变量与值,函数与函数体的关系的字典,就称为名称空间
  • 名称空间的种类
    • 内置命名空间:存储内置函数的名称空间
    • 全局命名空间:py文件执行时,存储变量名与值、函数名与函数体的关系的名称空间
    • 局部命名空间:函数执行时,内部产生的临时命名空间
  • 名称空间的加载顺序
    • py文件没有执行时,内置函数就存在,所以内置名称空间加载最早
    • py文件执行时,才会定义函数和执行函数,所以全局名称空间在局部之前
    • 内置 > 全局 >局部
  • 名称空间的取值顺序
    • 取值顺序遵从就近原则,单项不可逆原则
    • 就是从当前名称空间开始找,如果当前名称空间有,就用当前的,没有就向上找变量或函数,但是不能往下级名称空间找

作用域

  • 什么是作用域:函数和变量能使用的特定区域就称为作用域
  • 全局和局部作用域:
    • 全局:变量和函数,在py文件的全部的区域都可使用,具体范围包含内置名称空间和全局名称空间的变量和函数
    • 局部:函数名称空间内的变量和函数只能在函数内使用,函数外不能使用
  • 作用域取值和加载顺序:
    • LEGB(就近原则):同名称空间取值原则一致,或者说作用域就是概括性的名称空间
    • 全局包含局部,先加载全局才会产生局部

函数的嵌套(高阶函数)

  • 在函数内定义函数或调用函数就是函数的嵌套
  • 函数内的代码执行是从上到下,直到执行到return或最后的代码,才会跳出函数,如果函数内有其他函数的调用,就得等被调用函数执行完才,继续执行本函数

globals、locals

  • global():返回全局作用域内的名称空间
  • locals():返回当前作用域内的名称空间

标签:文件,func,函数,形参,f1,python,基础,str
来源: https://www.cnblogs.com/caixueming/p/16296761.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有