Python
快来分享你的内容吧~
Python学习 Day8
# 异常 ## 1、定义 当检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误提示,这就是所谓的异常。   ## 2、捕获指定异常  **注意:** 1、如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常 2、一般try下方只放一行尝试执行的代码  ## 3、捕获多个指定异常 当捕获多个指定异常时,可以把要捕获的异常类型的名字,放到except后,并使用元组的方式进行书写  ## 4、捕获异常描述信息  ## 5、捕获所有异常  ## 6、异常的else **else表示的是如果没有异常要执行的代码**  ## 7、异常的finally finally表示的是无论是否异常都要执行的代码,例如关闭文件  ## 8、异常的传递  ## 9、自定义异常 在Python中,抛出自定义异常的语法为 raise 异常类对象  # 模块和包 Python模块(Module),是一个Python文件,以 .py 结尾,包含了Python对象定义和Python语句。 模块能定义函数,类和变量,模块里也能包含可执行的代码 ## 1、导入模块的方式 import 模块名 from 模块名 import 功能名 from 模块名 import* import 模块名 as 别名 from 模块名 import 功能名 as 别名 ### 1.1、import  ### 1.2、from...import...  调用不需要在书写模块名.功能名()  ### 1.3、from ... import*  调用不需要在书写模块名.功能名(), * 表示导入当前模块所有的功能 ### 1.4、as定义别名  **模块名定义为别名后不能再使用原模块名,只能使用别名** ## 2、制作模块 在python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字,也就是说定义模块名必须符合标识命名规则。 ### 2.1、定义、测试模块 新建Python文件  \__name_是系统变量,是模块的标识符,值是:如果是自身模块值是\_main__,否则就是当前模块名 ### 2.2、调用模块 当在别的文件中调用自定义的模块时自定义模块内的print会输出模块名 
Python学习 Day7
# 面向对象-继承 子类默认继承父类的所有属性和方法  **在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类** ## 1、单继承 一个子类只继承一个父类 ## 2、多继承、 一个类同时继承多个父类,**当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法**  ## 3、子类重写父类同名方法和属性   ## 4、子类调用父类的同名方法和属性  ## 5、多层继承  ## 6、super()调用父类方法 super(当前类名,self).函数() 或 super().函数名()    使用super()可以自动查找父类。调用顺序遵循\__mro__类属性的顺序。比较适合单继承使用 ## 7、私有权限 在Python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类 设置私有权限的方法:**在属性名或方法名前面加两个下划线 __**  **私有属性和私有方法只能在类的里面访问和修改** ## 8、获取或修改私有属性值 在Python中,一般定义函数名 get_xx用来获取私有属性,定义set_xx用来修改私有属性值  # 面向对象-多态 ## 1、面向对象的三大特性 **1、封装:** 将属性和方法书写到类的里面的操作即为封装 封装可以为属性和方法添加私有权限 **2、继承:** 子类默认继承父类的所有属性和方法 子类可以重写父类属性和方法 **3、多态:** 传入不同的对象,产生不同的结果 ## 2、多态 多态是指一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) **定义**:多态是一种适用对象的方法,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果 **好处**:调用灵活,有了多态,更容易编写出通用代码,做出通用编程,以适应需求的不断变化。 **步骤**: 定义父类,并提供公共方法。 定义子类,并重写父类方法 传递子类对象给调用者,可以看到不同子类执行效果不同  # 类属性和实例属性 ## 1、设置和访问类属性 类属性就是**类对象**所拥有的属性,它被**该类的所有实例对象**所共有 类属性可以使用**类对象**或**实例对象**访问  类属性的优点 1、记录的某项数据 始终保持一致时,则定义类属性 2、实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省空间 ## 2、修改类属性 **类属性只能通过类对象修改**,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。  # 类方法和静态方法 ## 1、类方法 ### 1.1、类方法特点 需要用装饰器 **@classmethod** 来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数 ### 1.2、类方法使用场景 1、当方法中需要使用类对象(如访问私有类属性等)时,定义类方法 2、类方法一般和类属性配合使用 ## 2、静态方法 ### 2.1、静态方法特点 1、需要通过装饰器 @staticmethod 来进行修饰,**静态方法既不需要传递类对象也不需要传递实力对象(相参没有self/cls)** 2、静态方法 也能通过 **实例对象** 和 **类对象** 去访问  ### 2.2、静态方法使用场景 1、当方法中**即不需要使用实例对象**(如实例对象,实例属性),**也不需要使用类对象**(如类属性、类方法、创建实例等)时,定义静态方法 2、**取消不需要的参数传递**,有利于**减少不必要的内存占用和性能消耗** 
python学习 Day6
# 面向对象 面向对象就是将编程当成是一个事物,对外界来说,事务直接使用的,不用去管他内部的情况。而编程就是设置事物能够做什么事情。 ## 1、类和对象 类和对象的关系:用类去创建一个对象(用类去实例化一个对象) ### 1.1、理解 类是对一系列具有相同**特征**和**行为**的事物的统称,是一个抽象的概念。特征即使属性,行为既是方法。 ### 1.2、对象 对象是类创建出来的真实事物,先有类,后有对象。 ## 2、面向对象实现方法 ### 2.1、定义类 、 ### 2.2、创建对象 对象又名实例  ### 2.3、self  由于打印对象和打印self得到的内存地址相同,所以self指的是**调用该函数的对象** ## 3、添加和获取对象属性 对象属性即可在类外面添加和获取,也能在类里面添加和获取。 ### 3.1、类外面添加对象属性  ### 3.2、类外面获取对象属性   ### 3.3、类里面获取对象属性   ## 4、魔法方法 在Pyhton中,_XX_()的函数叫做魔法方法,指的是具有特殊功能的函数 ### 4.1、\_init()_ 作用:**初始化对象**  \_init()_方法,在创建一个对象时默认被调用,不需要手动调用 \_init(self)_中的self参数,不需要开发者传递,python解释器会自动把当前对象引用传递过去 ### 4.2、带参数的\_init()_  ### 4.3、 \_str()_方法 当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了\_str()_方法,那么就会打印从在这个中return的数据  ### 4.4、\_del()_方法 当删除对象时,python解释器会默认调用\_del()_方法  ## 5、案例 ### 5.1、烤地瓜 class SweetPatato(): #定义属性 def \__init__(self): #焙烤时间 self.cook_time = 0 #状态 self.cook_state = '生' #调料列表 self.condiments = [] #判断当前地瓜状态 def cook(self,time): self.cook_time += time if 0 <= self.cook_time < 3: self.cook_state = '生的' elif 3<= self.cook_time < 5: self.cook_state = '半生不熟' elif 5<=self.cook_time<8: self.cook_state = '熟了' elif self.cook_time>=8: self.cook_time = '烤焦了' #添加调料 def add_condiments(self,condiments): self.condiments.append(condiments) #打印当前状态 def \__str__(self): return f'这个地瓜已经烤了:{self.cook_time}分钟,状态是:{self.cook_state},调料有:{self.condiments}' digua1 = SweetPatato() print(digua1) digua1.cook(2) digua1.add_condiments('辣椒面') print(digua1) digua1.cook(3) digua1.add_condiments('酱油') print(digua1) 5.2、搬家具进房子 #家具类 class Furniture(): def __init__(self,name,area): self.name = name self.area = area #房子类 class room(): def __init__(self,address,area): #房屋地址 self.address = address #房屋总面积 self.area = area #剩余面积 self.free_area = area #家具列表 self.furniture = [] def __str__(self): return f'房屋坐落于:{self.address},面积有:{self.area}平方,剩余面积有:{self.free_area},家具有:{self.furniture}' def add_furniture(self,item): if self.free_area >= item.area: self.furniture.append(item.name) self.free_area -= item.area else: print('剩余面积不足无法放入') bed = Furniture("双人床",6) sofa = Furniture('沙发',10) jia1 = room('北京',100000) jia1.add_furniture(bed) print(jia1) jia1.add_furniture(sofa) print(jia1)
Python学习 Day5
# 递归 **一、特点** 1、函数内部自己调用自己 2、必须有出口 举例:  # Lambda表达式 也叫**匿名函数** ## 1、作用 如果一个函数右一个返回值,并且只有一句代码,可以使用lambda简化 ## 2、语法 lambda 参数列表 : 表达式 lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用 lambda表达式能接受任何数量的参数但只能返回一个表达式的值  举例:  ## 3、lambda表达式的参数形式 **1、无参数**  **2、一个参数**  **3、默认参数**  **4、可变参数**:*args  *这里的可变参数传入到lamdba表达式中,返回值为元组* **5、可变参数**:**kwargs  ## 4、lambda表达式的应用 **1、带判断的lamnda**  **2、列表数据按字典key的值排序**  # 高阶函数 把函数作为参数传入,这样的函数称为高阶函数。   ## 内置的高阶函数 ### 1、map(func,lst) map(func,lst),将传入的函数变量func作用到lst变量的每个元素,并将结果组成新的列表(python2)/迭代器(python3)返回  ### 2、reduce() reduce(func,lst),其中func必须右两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。注意:**reduce()传入的参数func必须接收两个参数**  ### 3、filter() filter(func,lst)函数用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象,如果要转换为列表,可以使用list()来转换  # 文件操作 **作用**:就是把一些内容(数据)存储起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力 文件操作步骤: 1、打开文件 2、读写等操作 3、关闭文件 ## 1、打开文件 在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法为: `open(name,mode)` name:是要打开的目标文件名的字符串(可以包含文件所在路径) mode:设置打开文件的模式(访问模式):只读、写入、追加等。mode参数省略时,表示访问模式是 **r**  mode访问模式:(主访问模式的特点:r,w,a) **r**:*以只读方式打开文件,文件的指针将会放在文件的开头。这是默认模式.**文件不存在会报错***,**不支持写入操作,只读**,所有带r的都会和这个一样,文件不存在报错 **rb**:*以二进制打开一个文件用于只读。文件的指针将会放在文件的开头。这是默认模式* **r+**:*打开一个文件用于读写,文件指针将会放在文件的开头。* **rb+**:*以二进制打开一个文件用于读写。文件的指针将会放在文件的开头。* **w**:*打开一个文件只用于写,如果该文件已存在则打开文件,并从开头开始编辑*,即**原有内容会被删除**。*如果该文件不存在,创建新文件*,文件指针在开头 **wb**:*以二进制打开一个文件只用于写入,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件* **w+**:*打开一个文件用于读写,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件* **wb+**:*以二进制打开一个文件用于读写,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件* **a**:打开一个文件用于追加。如果文件已存在,文件指针会放在文件的结尾。也就是说,新的内容将会写入到已有内容之后。**如果文件不存在,创建新文件写入** ab:以二进制打开一个文件用于追加。如果文件已存在,文件指针会放在文件的结尾。也就是说,新的内容将会写入到已有内容之后。**如果文件不存在,创建新文件写入** a+:打开一个文件用于读写。如果文件已存在,文件指针会放在文件的结尾。也就是说,新的内容将会写入到已有内容之后。**如果文件不存在,创建新文件写入** ab+:以二进制打开一个文件用于追加。如果文件已存在,文件指针会放在文件的结尾。**如果文件不存在,创建新文件写入** r+ w+ a+区别: 1、r+没有该文件会报错,文件指针在开头所以能读取出数据 2、w+没有文件会创建文件,文件指针在开头,用新内容覆盖原内容 3、a+没有文件会创建文件,文件指针在末尾,无法读取数据(文件指针后面无数据) ## 2、读取文件 ### 1、read() `文件对象.read(num)` num表示要从文件中读取的数据长度(单位是字节),如果没有传入num,那么就表示读取文件中所有数据  ### 2、readlines() readlines()可以按照行的方式把整个文件中的内容进行一次读取,并返回的是一个列表,其中每一行的数据为一个元素  ### 3、readline() readline()一次只读一行内容  ### 4、seek() 作用:用来移动文件指针 `文件对象.seek(偏移量,起始位置)` 起始位置: 0:文件开头 1:当前位置 2:文件结尾 ## 3、文件备份 `#备份文件 #1、输入目标文件名 old_name = input("请输入你要备份的文件名:") #2、规划文件名 #2.1 提取后缀,找 . 最右侧的点才是后缀的点 index = old_name.rfind('.')#返回的是所在的index #判断文件名是否有效 if index > 0: #提取后缀 postfix = old_name[index:] #print(res) #2.2 组织新名字 = 原名字 + [备份]+后缀 #原名字就是字符串中的一部分子串 -- 切片 [开始位置:结束位置:步长] #print(old_name[:index]) new_name=old_name[:index]+'[备份]'+postfix print(new_name) #3、备份文件写入数据 #打开原文件 和 新文件 old_file = open(old_name,'rb') new_file = open(new_name,'wb') #原文件读取,备份文件写入 #如果不确定文件的大小,循环读取写入,当读取的数据没有了终止循环 while True: con = old_file.read(1024) #读取的数据没有了终止循环 if len(con) == 0: break new_file.write(con) #关闭文件 old_file.close() new_file.close()` ## 4、文件和文件夹的操作 在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下 **1、导入os模块** `import os` **2、使用os模块相关功能** `os.函数名()` ### 4.1、文件重命名 `os.rename(目标文件名,新文件名)` ### 4.2、删除文件 `os.remove(目标文件名)` ### 4.3、创建文件夹 `os.mkdir(文件夹名称)` ### 4.4、删除文件夹 `os.rmdir(文件夹名称)` ### 4.5、获取当前目录 `os.getcwd()` ### 4.6、改变默认目录 `os.chdir(目录)` ### 4.7、获取目录列表 作用:获取某个文件夹下所有文件,返回一个列表 `os.listdir(目录)` ### 4.8、应用案例 批量重命名文件,添加或删除 ` #将当前目录下的所有文件重命名为Python_XXXX,或将某符合格式的文件名删除 import os #获取当前目录下所有文件名 file_list = os.listdir() #构造条件的数据 flag = 2 #构建名字 for i in file_list: if flag == 1: new_name = 'Python_'+ i #重命名 os.rename(i,new_name) elif flag == 2: num = len('python_') new_name = i[num:] os.rename(i,new_name) `
python学习 之 函数应用-学员管理系统
一、系统简介 需求:进入系统显示系统功能界面,如下 1、添加学员 2、删除学员 3、修改学员信息 4、查询学员信息 5、显示所有学员信息 6、退出系统 二、步骤分析 1、显示功能界面 2、用户输入功能序号 3、根据用户输入的功能序号,执行不同的功能(函数) 3.1定义函数 3.2调用函数 三、实现 ` #定义功能界面 def info_print(): print("-" * 20) print("1、添加学员") print("2、删除学员") print("3、修改学员信息") print("4、查询学员信息") print("5、显示所有学员信息") print("6、退出系统") print("-"*20) #所有功能函数都是操作学员信息,所以存储所有学员信息的变量应该是一个全局变量,数据类型为列表 info = []#等待存储所有学员的信息 #添加学员函数 """ 1、接受用户输入的学员信息 2、判断是否添加学院信息 2.1、如果学员姓名存在,则提示存在 2.2、如果学员姓名不存在,则准备空字典,将用户输入的数据追加到字典中,再列表追加字典数据 3、对应的if条件的位置调用该函数 """ def add_uesr(): ''' 添加学员函数 ''' #1、手动输入学员的学号、名字、手机号 user_id = input("请输入学员的学号:") user_name = input("请输入学员的名字:") user_tel = input("请输入学员的手机号:") #2、学员存在时报错提示,学员不存在时添加数据 global info #2.1 存在时报错提示,判断用户输入的name和学员列表info中字典的name对应的值相等,给出提示 for i in info: if user_name == i['name']: print("名字重复请重新输入!!!") return #退出当前函数(add_user)后面添加学员的代码不执行 #2.2 不存在时添加数据 #准备空字典 user_dict = {} #添加数据 user_dict['id'] = user_id user_dict['name'] = user_name user_dict['tel'] = user_tel print(user_dict) #列表添加 info.append(user_dict) print(info) #删除学员信息 """ 按用户输入的学员名字进行删除 1、用户输入学员姓名 2、检查这个学员是否存在 2.1、如果存在,则列表删除该学院 2.2、如果不存在,则提示不存 3、对应if 条件成立的位置调用该函数 """ def del_user(): """删除学员信息""" del_name = input("请输入要删除的学员名字") #声明info是全局变量 global info #遍历列表 for i in info: #判断当前学员是否存在 if del_name == i['name']: info.remove(i) print("已删除名字为",del_name,"的学员") break#已经找到要删除的学员信息并且删除了学员,后米娜不需要遍历该info,所以需要break跳出遍历 #用else是因为所有学员已经全部遍历都没有找到,证明循环已正常结束 else: print("该学员不存在") print(info) #修改学员信息 """ 1、用户输入目标学员姓名 2、检查该学院是否存在 2.1、如果存在,则修改这位学员信息,例如手机号 2.2、如果不存在,则报错 3、对应if 条件成立的位置调用该函数 """ def modify_user(): """修改学员信息""" modify_name = input("请输入你要修改的学院的姓名") #声明info是全局变量 global info for i in info: if modify_name == i['name']: i['tel'] = input("请输入学员的新手机号") break else: print("该学员不存在") print(info) #查询学员 def search_user(): search_name = input("请输入要查找的学员名字") global info for i in info: if search_name == i['name']: print("你要查询的学员信息如下:------") print("学员的名字是",i['name'],",学员的id是",i['id'],",学员的手机号是",i['tel']) break else: print("学院不存在") print(info) #显示所有学员信息 def print_user(): print("学号\t姓名\t手机号") for i in info: print(f"{i['id']}\t{i['name']}\t{i['tel']}") while True: #1、显示功能界面 info_print() #2、用户输入功能序号 user_num= int(input("请输入功能序号:")) #3、按照用户输入的功能序号,执行不同的功能(函数) if user_num == 1: add_uesr() elif user_num == 2: del_user() elif user_num == 3: modify_user() elif user_num == 4: search_user() elif user_num == 5: print_user() elif user_num == 6: exit_str=input("确定要退出系统吗 yes/no:") if exit_str == 'yes': break else: print("输入有误!!!请选择1-6") `
Python学习 Day4
# 推导式(生成式) ## 1、列表推导式 **作用**:用一个表达式,创建一个有规律的列表或控制一个有规律的列表,用于简化代码 ***以创建一个0-10的空列表举例***  **for循环中不需要手动控制迭代变量自增** ***带 if 的列表推导式***  ***多个for循环实现列表推导式*** **等同于for循环嵌套**  ## 2、字典推导式 **作用**:快速合并列表为字典或提取字典中的目标数据   ## 3、集合推导式  **集合具有去重功能** # 函数 将**一段具有独立功能的代码块**整合到一个整体并命名,在需要的位置**调用这个名称**即可完成对应的需求。**定义函数的时候,函数体内部缩进的代码并没有执行** ## 1、函数定义  ## 2、调用函数  ## 3、函数参数的作用 **形参**:函数定义时书写的参数(非真实数据) **实参**:函数调用时书写的参数(真实数据)  ## 4、函数的返回值作用 在函数中,如果需要返回结果给用户需要使用函数返回值 **return**返回结果给函数调用的地方: **return**的作用: 1、负责函数返回 2、退出当前函数:导致return下方的所有代码(函数体内部)不执行 ## 5、定义函数的说明文档  ## 6、变量作用域 变量作用域指的是变量生效的范围,主要分**局部变量**和**全局变量** **局部变量**:定义在函数体内部的变量,即只能在函数体内部生效。**作用**:在函数体内部,临时保存数据,即当函数调用完成后在,则销毁局部变量 **全局变量**:在函数体内、外都能生效的变量 ### 6.1 修改全局变量的值 想要在函数体内部修改全局变量的值需要在函数内部进行声明,然后进行重新赋值即可修改  ## 7、函数的返回值 当要返回多个返回值时需要用: return a,b 1、return a,b 的写法返回对各数据时,默认返回类型为元组 2、return后面可以连接列表,元组或字典,已返回多个值 ## 8、函数的参数 ### 8.1 位置参数 调用函数时根据函数定义的参数位置来传递参数  ### 8.2 关键字参数 函数调用,通过“**键 = 值**” 形式加以指定,可以让函数更加清晰,容易使用,同时也清楚了函数的顺序需求。注意:**函数调用时,如果有位置参数,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序**。  ### 8.3 缺省参数 缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该参数(所有位置参数必须出现在默认参数前,包括函数定义和调用)。注意:**函数调用时,如果为缺省参数传值则修改默认参数值,否则使用默认值**  ### 8.4 不定长参数 不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing),或者关键字参数,来进行参数传递,会显得非常方便 #### 8.4.1 包裹位置传递  注意:**传进的所有参数都会被args变量收集,他会根据传进参数的位置合并为一个元组,args是元组类型,这就是包裹位置传递** #### 8.4.2 包裹关键字传递  **无论是包裹位置传递还是包裹关键字传递,都是一个组包过程** ## 9、拆包和交换变量值 ### 9.1 拆包:元组  ### 9.2 拆包:字典 **对字典进行拆包取出来是的字典的key**  ### 9.3 交换变量的值  ## 10、引用 在python中,**值都是靠引用来传递的** 可以用 **id()** 来判断两个变量是否为同一个值,可以将id()值理解为那块内存的地址标识 *不可变类型*   *可变类型*  ### 10.1 引用当实参使用  ## 11、可变和不可变 所谓可变数据类型与不可变数据类型:数据能够直接进行修改,如果能直接修改那就是可变,否则是不可变 **可变数据类型**:列表、字典、集合 **不可变数据类型**:整型、浮点型、字符串、元组
python学习 Day3
# ***while循环*** break:当前条件成立时,退出整个循环,例,吃五个苹果,迟到第三个时吃饱了,第四个,第五个不吃 continue:当前条件成立时,推出当前循环,执行下一次循环,在continue前一定要修改计数器,否则进入死循环 ## ***while循环嵌套***  # ***for循环***  *for循环中break和continue同样适用* # ***循环和else*** else下方缩进的代码是**指当循环结束之后要执行的代码** ## *whlie...else*  所谓的else指的是循环正常结束之后要执行的代码,即如果是**break终止循环**的情况,else下方缩进的代码将不执行 因为continue是指退出当前循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码 ## *for...else*  所谓的else指的是循环正常结束之后要执行的代码,即如果是**break终止循环**的情况,else下方缩进的代码将不执行 因为continue是指退出当前循环,继续下一次循环,所以该循环在continue控制下是可以正常结束的,当循环结束后,则执行了else缩进的代码 # 字符串 ## *切片* 语法: 序列[开始位置下标:结束位置下标:步长]  ## *常用操作方法* 字符串的常用操作方法有查找、修改和判断三大类 ### *查找* 即查找子串在字符串中的位置或出现次数 ***find()和index()*** *find()*:检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则返回-1  *index()*:检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,不存在则会报错 *count()*: 检测某个子串是否包含在这个字符串中,如果在返回这个子串出现的次数,不存在则返回0 语法同find() *rfind()*:从右侧开始检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,否则返回-1 *rindex()*:从右侧开始检测某个子串是否包含在这个字符串中,如果在返回这个子串开始的位置下标,不存在则会报错 ### *修改* 指的是通过函数的形式修改字符串中的数据 replace()、split()和join() *replace()*:替换  不会将原有字符串进行修改,replace()有返回值,返回值为修改后的字符串,说明**字符串是不可变的数据类型**,换次数如果超过了子串出现的次数,表示替换所有这个子串 *split()*:分割,会返回一个列表,**会将分割字符丢失**  *join()*:合并列表里面的字符串数据为一个大字符串  字符或子串是指将要连接新的字符串的标识 ### *常用函数* **大小写转换** ***字符串为不可变类型,当修改时需要进行赋值*** capitalize():将字符串第一个字符转换成大写,转换后,只有字符串第一个字符大写,其他字符全都小写 title():将字符串每个单词首字母大写 lower():将字符串中大写转换成小写 upper():将字符串中小写转大写 **删除空白字符** lstrip():删除字符串中左侧空白字符 rstrip():删除字符串中右侧空白字符 strip():删除字符串中两侧空白 ## 判断 isalpha():如果字符串中右一个字符并且所有字符都是字母则返回true,否则返回false isdigit():判断数字 isalnum():数字或字母组合 isspace():判断空白 # 列表 *格式:* [数据1,数据2,数据3] *常用操作方法* index():检查某个数据是否存在,存在则返回对应下标,不存在则报错 len():统计列表中数据的个数 append():在列表结尾追加数据 pop():删除数据,可指定下标 remove(): # 元组 **元组中的数据不能修改** *定义元组:* t1 = (10,20,30) t2 = (10,)定义一个元组时要加逗号 *常用操作方法:* index(): len(): # 字典 *定义字典:* dict1 = {'name':'python','age':30} dict2 = {} dict3 = dict() *常见操作:* **增/改**:字典序列[key] = 值 **查找**: 字典序列[key]:存在则返回对应的value不存咋则报错 keys(): values(): items():返回的数据时元组类型 # 集合 是可变数据类型且有去重功能 ***创建集合*** **有数据集合**:s1 = {数据1,数据2,数据3} **无数据集合**:s1 = set() ***常见操作*** 增加数据: add():增加单一数据 update():增加序列数据 删除数据: remove():数据不存在时报错 discard():数据不存在时不报错 # 公共操作 运算符  # 公共方法 len():计算容器中的元素个数 del或del():删除 max():返回容器中元素最大值 min():返回容器中元素最小值 range(start,end,step):生成从start到end的数字 步长为step,供for循环使用,只有配合for循环才能拿到,单纯打印不会出现 enumerate():函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用于for循环中   # 容器类型转换 tuple():将某个序列转换成元组 list():将某个序列转换成列表 set():将某个序列转换成集合
Python学习 Day2
# 基本数据结构 List:列表 Tuple:元组 Dictionary:字典 Set ## 1、list list: [ , , ]存在于计算机中的连续的内存空间 例:days_in_month=[31,28,31,30,31,30,31,31,30,31,30,31] list中可以放不同的元素,可通过索引访问 **创建** empty_list = []#创建空列表 another_empty_list = list()#创建 weekdays=['Monday','Tuesday','Wednesday','Thursday','Friday'] **删除** ***delete***:通过索引寻找  ***remove***:通过元素值寻找  **添加** ***append***:将要加的元素添加到当前list的最后  ***+***:将两个列表进行拼接  ***insert***:将元素插在list的任意位置  ***index***:找到对应的元素并返回该元素所在的位置  **pop**:在列表中取某一元素,并将列表内的该元素清楚,pop内可写入对应索引   **排序** ***sort*** - **列表方法** `sort()` 会就地对列表进行排序。原列表内部结构变化,需要列表内元素为同一类元素 - **通用函数** `sorted()` 会返回列表的排序副本。即复制一份新的,原列表内布不会发生变化    例: 1、通过sorted将字符串及进行排序  2、希望返回的值不以list形式展示,而是返回为字符串形式  join() 返回一个字符串,其中序列的字符串元素已被 str 分隔符连接起来 ***copy***  *赋值:原值改变后赋值出来的也跟着变 复制:原值改变后复制出来的不会跟着变化* string是不可以被修改的,list是可以被修改的 ## 2、Tuple 和列表类似,元组也是任意元素的序列。不过,元组是不可变的。定义后你不能添加、删除或修改它。 **创建**  元组和列表的区别 - 元组占用的空间更少(动态的) - 你不会不小心覆盖元组里的元素 - 你可以用元组作为字典的键 - 函数参数是以元组的形式传递的 ## 3、Dictionary 是一种<key:value>形式的,字典 似于列表,但条目的顺序不重要,也不是通过偏移量(索引)来选择的。相反,你需要指定一个唯一的 键 关联每个值。键通常是字符串,但也可以是 Python 的任何不可变类型。 **创建**    **添加** ***update***  ***remove***  根据某一个key访问value,访问速度快(list远远慢于字典) 原因:list是一个连续的空间,字典是将key通过一个“黑盒子”返回为int值,用该int值与字典的len取模得到的余数(范围为[0,size))作为访问时的index,类似于hash ## 4、set set中的元素不能重复,具有唯一性,相比于字典来说只有key,没有value **创建**  **集合操作**  ***将基本数据类型转换为list***  ***将基本数据类型转换成字典***  1. 变量必须是序列,2. 每个元素的长度都等于 2 *也可以使用 zip() 函数来生成这种配对*  也可以使用 unzip() 函数来将配对进行压缩  ***Mutable, Immutable*** 像 (int, float, bool, str, tuple, unicode) 这样的内置类型对象是不可变的。像 (list, set, dict) 这样的内置类型对象是可变的。自定义类通常是可变的。字典中的key值能放Immutable的类型
Python3学习 Day1
notebook 为 Anacond3 # 数据类型 1、Integer (int) 2、Float (float) 3、Boolean (bool) 4、String (str) ## 1、int(整型)  **//**:取整,计算出来的结果为整数  **/**:计算出来的结果为Float,带小数  **%**:取余  *可用type()查看对应的数据类型*   注:在 Python2 中,`int` 的大小限制为 32 位,这足够存储从 -2,147,483,648 到 2,147,483,647 的整数。`long` 可以存储 64 位。超过这个范围的整数会导致 **整数溢出**。 在 Python3 中,一个 `int` 可以处理任意大的整数,不会导致溢出。 ## 2、Float(浮点)  **Math 函数** Python 还提供了很多有用的数学函数,都包含在 `math` 包里。要使用它们,需要先 `import math`。     ## 3、Boolean(布尔类型)  ## 4、String(字符串) 字符串的三种表示 1、单引号 s = 'this is a string' 2、双引号 str = "this is also a string" 3、三单引号/三双引号  目前看只有这个形式才能在不加 \n 的情况输出时直接换行? ### 类型转换   ### 合并、复制  ### 提取和切片 #### 1、提取单个字符串  #### 2、提取子字符串 Format: [start:end:step] [:] 提取所有字符串 [start:] 从start到尾 [:end] 从头到end-1 [start:end] 从start到end-1 [start:end:step] 从start到end - 1, 每隔step-1取一次  ### 获取字符串的长度  ### 分离和合并 spilt()返回的是一个list  ### 替换  ### 格式  ### 其他用法 
ros2的学习
ROS2的框架: 应用层 中间层 系统层。 相较于ros1中,ROS通信依赖底层的TCP和UDP,而在ros2,通信协议换成了更加复杂也更完善的数据分发服务DDS。
