热门推荐
pycharm 每次打开都重新索引
2024-12-14 05:23


pycharm 每次打开都重新索引

例子:

参数类型

①必选参数

②默认参数(缺省参数)
要注意的时在默认参数后面不能有必选参数(如:(a,b=20,c)是不可以的)

③可变参数
当参数的个数不确定时使用,*来定义,且要在关键字参数之前

④关键字参数
在函数题内,关键字参数是一个字典类型,** 来定义,且参数的 个数不限

综合例子

返回值

return可以返回一个值或多个值,当返回一个值返回的是那个值;而返回多个值时则返回一个包含多个值的元组;当有返回多个值且有多个变量接收时值会被一一对应赋值

局部变量与全局变量

  • 局部变量与全局变量同时出现时,局部变量优先级更高;且这两个变量为完全不同的两个变量(变量的内存地址不同)
  • 要注意当 想改变全局变量且这个变量为不可变类型(str、int、tuple、float) 时需要使用global来提升变量为全局变量,而当想改变全局变量且这个变量为可变类型(dict、list)不需要使用global来提升变量就可以更改变量里面的值
  • nonlocal与global有异曲同工之妙,nonlocal是对非全局变量的提升,当然nonlocal也只是针对不可变类型的变量
  • 函数locals()用来查看本地变量有哪些,并以字典的形式输出
  • 函数globals()用来查看全局变量有哪些,并以字典的形式输出

可以通过global关键字把局部变量提升为全局变量

可以通过nonlocal关键字提升局部变量

所以我们了解到在python中万物皆对象,且在函数调用的时候实参传递的时对象的引用(地址)

匿名函数

python中使用lambda关键字创建匿名函数,所谓匿名即这个函数没有名字不用使用def关键字创建标准的函数它自带return,且return的结果为表达式的结果,它一般用做参数传入函数

语法:lambda 参数1,参数2,参数3:代码表达式语句

例如:

map函数

map函数根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

map(function, iterable, …)

reduce函数

函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

reduce(function, iterable[, initializer])

filter函数

函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

filter(function, iterable)

递归函数

递归函数定义时要注意两个方面,一个是有明确的结束条件,另一个是自己调用自己;它有逻辑简单等优点,但同时它会更加容易导致栈溢出等问题;可用于实现树形结构的遍历

python的内置函数传送门

数学运算

abs() – 求绝对值
round(x[, n]) – 对x取近似值,保留n位小数,默认为四舍五入,若n大于实际小数部分长度则不进行操作
pow(x, y[, z]) – 函数是计算 x 的 y 次方,如果 z 在存在,则再对结果进行取模,其结果等效于 pow(x,y) %
divmod(a, b) – 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
max(iterable) – 最大值,其参数可为x, y, z, …
min(iterable) – 最小值,其参数可为x, y, z, …
sum(iterable[, start]) – 对序列进行求和计算。iterable为可迭代对象(如:列表、元组、集合),start为指定相加的参数,如果没有设置这个值,默认为0
eval(expression[, globals[, locals]]) – 用来执行一个字符串表达式,并返回表达式的值。expression – 表达式。globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

类型转换函数

int() – 转为int,下取整
float() – 转为float
str() – 转为str
ord() – 字符转数字
chr() – ASCII码转为字符
bool() – 转为boolean类型
bin() – 转为二进制
hex() – 转为十六进制
oct() – 转为八进制
list() – 元组转为list
tuple() – 列表转为tuple
dict() – 创建dict
bytes() – 转为字节数组

序列操作

all() – 用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False 外都算 True。
any() – 用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。元素除了是 0、空、FALSE 外都算 TRUE。
sorted() – 对所有可迭代的对象进行排序操作。sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
reverse() – 用于反向列表中元素。
range() – 可创建一个整数列表
zip() – 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
enumerate() – 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

面向过程是指按照解决问题的步骤进行编写程序,而面向对象是指把事物的具体特征抽象出来形成类再进行编写程序的

类和对象

类是一个模板,模板里面可以有方法;而对象根据类创建的实例,可通过实例对象使用类里面的方法;并且在类的内部,使用def关键字可以定义一个实例方法,与一般函数定义不同,实例方法必须包含参数self它必须为第一个参数名字不一定为self,这里是约定俗成);同时在类内可以定义不同的类属性(方法外面定义的属性)与实例属性(在方法内使用self.属性名定义而得的);无论是实例方法还是实例属性都是属于实例本身的;python构造方法包括创建对象初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法,同时头尾双下划线的方法(属性)也被叫做魔法方法(属性)魔术方法会在某个特殊的时候被自动执行

self

self实例对象指向同一个内存地址,可以认为self就是实例对象,相当于java里面的this

魔术方法

__init__() – 是当实例对象创建完成后被触发的,然后设置对象属性的一些初始值。
__str__() – 是在print对象时被触发,打印对象的信息以测试的时候使用,因为如果不用的话会就只输出对象的地址而不会有其他的信息,注意要用return,与java里面的toString()类似
__new__() – 是在实例创建之前被触发的,因为它的任务就是创建实例然后返回该实例,先于init函数的执行
__call__() – 在把对象当作函数来调用时触发,且执行该函数里面的内容(例如:它可以执行 x1(1,2)这样的函数,而不是x1.__call__(1, 2))
__del__() – 在程序运行结束后进行对象销毁的时候触发这个方法,来释放资源

例如:

__init__()
__str__()
__new__()

注意事项:

  • __new__是在一个对象实例化的时候所调用的第一个方法
  • __new__至少必须要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,其他的参数是用来自动直接传递给_init_方法的
  • 在__new__方法中,不能调用自己的__new__方法,即:return cls.__new__(cls)

例一:

例二:

__call__方法
__del__()方法(析构方法)

当一个对象没有在被引用的时候,它会被删除或被销毁,此时python解释器会默认调用一个方法,这个方法为 __del__(),它也被称为析构方法,简单的说这个函数并不对对象进行销毁,而只是在系统内部执行销毁时调用这个函数del关键字可以销毁对象

类属性与实例属性

类属性就是拥有的属性,它被该类的所有实例对象共有实例都可以访问它;实例属性对象所有的属性只能通过实例对象访问;要注意的是不同的实例对象的类属性是同一个指向(地址相同)同时出现类属性与实例属性时,实例属性优先级高

类方法与静态方法

  • 类方法所拥有的方法,需要用装饰器@classmethod来标识其为类方法,对于类方法它的第一个参数必须为这个类,一般以cls命名类方法可以通过实例对象调用类方法的执行不依赖于实例对象
  • 静态方法类对象拥有,需要用@staticmethod来标识静态方法,没有默认参数静态方法可以通过实例对象调用,不过我们一般不用实例对象来访问静态方法,所以静态方法里面的代码都是与业务逻辑无关的,其功能是独立的
  • 类属性、实例方法、类方法、静态方法在内存中只保存⼀份,且保存在类中。而实例属性每个实例对象中都要保存⼀份。
  • 因为 __class__ 的存在使实例对象可以访问类属性、实例方法、类方法、静态方法、实例属性。
  • 只能访问类属性、类方法、静态方法。类不能访问实例属性的原因是实例属性存储在实例中。虽然实例方法是定义在类中但是只有那些被装饰器装饰过的方法才可以被类调用

私有属性与私有方法

  • 为了保护属性(方法)安全使之不能在类的外部直接被访问,则将属性(方法)定义为私有属性(方法)
  • 定义方法:两个下划线开头
  • 要注意的是私有属性(方法)不会被它的派生类继承
  • 要注意的是这里的私有不是真正的私有,而是名义上的私有。因为他的底层只是把私有属性(方法)改了个名字,通过这个名字就可以调用私有属性(方法)方法但是不建议这样调用。可使用dir()函数查看
  • dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表

property

因为在访问私有属性必须通过类里面的方法调用,这样很别扭,因为我们想用属性却调用了方法,所以property应运而生,他解决了在使用属性时调用方法的这种奇怪场景。它有两种实现方法①利用property属性函数②利用装饰器,但要注意顺序

单继承

子类可以重写父类的方法,且子类会继承父类公开的方法与属性子类的方法优先级大于父类的方法

多继承

多个父类中有相同的方法时,查询的顺序为广度优先,同级则从左到右
例如:

继承的传递

子类调用父类方法

  • 要注意这里的super()与super(type, obj)都是获得当前的类的父类,而super(type, obj)只是在底层进行了一个isinstance(type, obj)
  • 这里的type是类名obj为实例对象类名可以看成自定义类型

多态

多态是指同一个行为具有多个不同表现形式或形态,因为Python是天生支持多态的,且它的写法不同于Java和C#这一类强类型语言中的多态的写法,所以它可利用“鸭子类型”来实现多态;但要实现多态有两个前提:继承与重写。同时也要注意isinstance()函数的使用

好处:它增加程序的灵活性与扩展性

单例模式

单例模式是常用设计模式的一种,也就是说这个整个系统中只有一个实例,重复打并也是使用这个实例。简单的说就是不管创建多少次对象,类返回的对象都是最初创建的,不会再新建其他对象。

动态添加属性和方法

__slots__变量

python是动态语言,在运行的时候可以动态添加属性。如果要限制在运行的时候给类添加属性,Python允许在定义class的时候,定义一个特殊的 __slots__变量,来限制该class实例能添加的属性。只有在 __slots__变量中的属性才能被添加,没有在_slots_变量中的属性会添加失败。它可以防止其他人胡乱添加属性和减少内存消耗子类不会继承父类的__slots__属性,但当子类也声明__slots__属性时此时的slots值就为父类于子类的并集,所以注意slots不要重复写

异常处理简单说明

  • python里面的错误抛出机制当程序在运行时发生异常,解释器会查找在该层的异常捕获类型是否可以捕获,如果不能捕获则将异常传递给上一层,直到最后一层,如果最后一层都没有捕获到则程序直接down,所以python只要在合适的层次去捕获就行了,这样可以减少我们书写错误捕获模块的代码
  • 且一个错误处理块可以有多个except,Exception 包含了多个错误类型,但它无法对每个错误进行精确的描述以提醒用户
  • 若使用Exception类型的错误,则必须写在其他的异常处理的后面
  • finally里面的代码无论如何都会执行,也就是说如果try、except、else、finally里面都有return的时候,输出的永远是finally里面的return,因为其它块里面的return被finally的return所覆盖了

自定义异常

自定义异常都需要直接或间接继承Error或Exception,且要使用raise关键字

闭包

  • 闭包就是在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包,它可以保存保存外函数的状态
  • 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束

还不懂的可以点击这里

装饰器

  • 装饰器有两个特点:①函数是作为参数出现的,②要有闭包的特点
  • 使用装饰器的目的为了扩展函数但又不想修改原函数的代码,且想使用原函数名来调用
  • 装饰器的执行顺序(以下面的代码为例):①下面的@decorator会执行decorator函数,而它下面的函数(被装饰函数)则会在系统底层被当成参数传给decorator函数;②decorator函数执行,并返回wrapper函数的指向;③返回的指向在系统底层被赋值给bar;④调用函数bar,则实质上是调用函数wrapper
  • 要注意的是若有多个装饰器,则执行离被装饰函数最近的装饰器,以此类推
  • 装饰器带参数写三层不带参数写两层
不带参数的装饰器
带参数的装饰器

列表推导式

列表推导式就是对旧列表进行某些操作然后返回一个新列表

语法:[out_express for out_express in input_list if out_express_condition]

例1:

例2:

例3:

集合推导式

集合推导式类似于列表推导式,只是把[]换成{}并返回一个新的集合

字典推导式

字典推导式类似于列表推导式,只是把[]换成{}并返回一个新的字典

  • 在Python中,一种一边循环一边计算的机制,称为生成器: generator
  • python中的generator保存的是算法真正需要计算出值的时候才会去往下计算出值。它是一种惰性计算(lazy evaluation)
  • 避免了大量空间的浪费,使我们可以在循环的过程中不断推算出后续的元素
  • 生成器可以避免不必要的计算,带来性能上的提升;而且会节约空间,可以实现无限循环(无穷大的)的数据结构
  • 利用生成器可用来实现协程(进程 - > 线程 -> 协程)

定义生成器方式

方法一:通过列表推导式

只需要把一个列表生成式[]改成(),就创建了一个generator

方法二:在函数里使用yield关键字

函数里有了yield后,执行到yield就会停住当需要再往下算时才会再往下算。所以生成器函数即使是有无限循环也没关系,它需要算到多少就会算多少,不需要就不往下算。可以简单地把yield n 理解为 return n + 暂停

使用生成器

  • 每调用一次则产生一个值,而不是像列表生成器一样一股脑的生成全部的值
  • 但当超过长度时,使用程序会报异常
方法一:生成器内置函数__next__()
方法二:Python内置函数next()
方法三:for循环遍历生成器

当然其实平常很少用到next()或__next__(),我们直接用for循环就可以遍历一个generator,其实for循环的内部实现就是不停调用生成器的下一个值

可迭代对象

可迭代对象有列表、元组、字符串、生成器、集合、字典

判断是否为可迭代的

迭代器

  • 迭代器不等于可迭代对象,例如生成器既是迭代器也是可迭代对象,而列表是可迭代对象而不是迭代器。但是可以通过iter()函数把可迭代对象转换为迭代器
  • 迭代器从第一个元素开始访问,直到所有的元素被访问完结束
  • 迭代器只能往前不会后退
  • 可以被next()函数调用不断返回下一个值的对象称为迭代器:Iterator
  • 迭代器包含了生成器,而生成器不包含迭代器。所以就好如迭代器是一个集合,而生成器是它的一个元素

单下划线(_xxx):前面加一个下划线以单下划线开头的表示的是protected类型的变量,即保护类型只能允许其本身写子类D行访问,不能使用from xoxx import *的方式导入。
双下划线(__xxx):为私有属性
头尾双下划线(__xxx__):前后两个下滑线,魔法方法(属性),一般是python自有,开发者不要创建这类型的方法。
尾单下划线(xxx_)避免属性名与python关键字冲突
super() 用于调用父类
函数、列表、字典每次定义都会开辟一块空间

本文只用于个人学习与记录

    以上就是本篇文章【pycharm 每次打开都重新索引】的全部内容了,欢迎阅览 ! 文章地址:http://www78564.xrbh.cn/quote/26800.html 
     动态      相关文章      文章      同类文章      热门文章      栏目首页      网站地图      返回首页 迅博思语移动站 http://www78564.xrbh.cn/mobile/ , 查看更多