python自我总结笔记,加上一些自己思考

时间:2023-01-29 17:17:03


                                          python基本语言元素的总结
  • python基本数据类型和基本操作我就不讲了,这个和java等语言并无什么大的差异,值得注意的是python里面所有数据类型都是句柄操作,也比java面向对象的特性更加深入。
  • Python string 字符串编码也是利用了unicode比较方便使用
  • python的关键数据结构:(1)list ,是以[]包括起来的数据结构,然后是可变数据类型,意思是里面的句柄可以改变,增加删除元素的方法我也不说了,非常灵活,不仅可以正向取数据还可以反向下标取数据。例如[1,2,3][-1]取倒数第一个数出来
  • 第二个数据结构是tupe,与list类型,但是它里面的数据句柄是不可变得,这里注意是句柄不可变不代表数据就不可变,举个例子:(1,2,3,[‘x’,’y'])这里[‘x’,’y']这个list句柄不可变,但是它里面的x,y这两个元素确实可以变的。取数的规律就像C中的二维数组,不多罗列。
  • 接着照着语言的特性,到循环了。以前我觉得python的判断和循环怎么这么不正常,现在看起来,python的判断循环的语法糖简直太符合心意了,就像伪代码,写起来蛮简洁,这个也没什么好说的。
  • 到了dict了,这里的dict其实就是对应的别的语言的map,是一种二维的映射关系,也是用空间换时间的一种方式,同样的和前面的list对比,也是添加删除数据都异常灵活,如果key找不到会抛出异常。而且因为是用类似hashmap的key-value查找方式,所以速度会很快,增加大量数据都不会减慢数据的查找删除工作。与此同时相比较list,当数据类较大时候,find和delete操作都要付出较大的代价。因为key需要用到hash值,所以key应该为不可变对象,这样才合理,事实也是这样。像List可变对象就不能作为hash的key。tuple是可以的,经试验,tuple里面包含list然后拿去做key,结果也不行,说明了key只能是不可变对象,里面不能包含List等可变对象
  • Dict返回值的时候还可以指定默认值这个也是个小的方便点。找不到key时候的做法,例如dict.get(9,-9)这样的合理性在于我不确定key有没有,我又不想总是去捕获没有key异常很麻烦,就可以用默认值返回作为辨识数字。
  • 然后下个有了dict,下个就是set,无他就是类似与hashset单一属性的结构,就是一个集合,和集合操作一样,重复添加相同元素没有效果,但是set是可以动态改变内容元素的,这里set就没有比较好的直接表示符号了,需要初始化时候,这样para=set([1,2,3]),我觉得这个表示稍显麻烦
  • python里面str也是不可变类型,一如java等面向对象语言。
                                                    python函数的总结
     首先要掌握的自然是函数定义等方法,和里面自带函数使用的api,这里不多说,相信python里面是有自带相当多好用又丰富的函数的,想要时可以直接查api。还有一点比较特别就是函数也可以当做句柄来赋值给变量,这点相当灵活。
例如: a=abs ,就可以把自带的abs函数赋值给a变量
     强制缩进的语法贯彻在python中,没啥好说。还有定义函数的语法说下:
定义一个函数: def Fun(para):
                                  If x>9:
                                        pass
                                   else
                                       return  True
   如上没有逻辑块时候pass是拿来做占位符的,因为python的对齐要求,所以需要占位符这么一个东西。还有返回值,函数需不需要返回无需定义,即使自己没有返回东西时候,其他函数也默默返回了一个None。
     python函数有一个问题就是参数类型可以是任意变量,这样就导致类型不知道,这时候我们很可能需要有一个能判断类型的东西,才不会导致调用其他函数导致异常。合情合理的猜想,没错应该要有,这个就是 isinstance,很普通的判断类型的东西,在java里面可以看到了。动态转化比较灵活的语言,我相信都应该有能明确判断类型的符号。命名差不多就是instanceof类似。python函数灵活体现还在能返回多个值,返回多个值回上一个调用层。其实仔细想想无非就是返回一个tupe,事实也正是这样,至于返回数量对不对的上变量数量等小问题,自己去查。这里涉及到一个tupe自动装箱接箱的东西,这个可以映射到java int 等基本类型在某个情形下自动装箱变为句柄的Integer,这里也没有什么出奇的。不过确实灵活好用。
     至于灵活的代价,我自己思考的是,从python好多类型不一致就抛出异常的情况下,导致自己捕获异常需要异常严格,不然一下子就可能导致程序崩溃,所以python作为胶水语言就是这样来的,大型工程用python没有严格工控代码,很容易导致代码的脆弱性和不可维护性吧,因为太过灵活。

函数参数灵活性第二点是默认参数,这个意思就是可以定义下面函数
Fun(a,b=3) ,我可以直接调用Fun(4)也可以,另一个参数默认就是3,这样做是为了减轻多个参数书写的方便性,回想起面向对象,我们就要重载方法了,对应不同个数的方法数,不同参数,这样一看,这种默认参数的做法确实灵活简洁。
还是有一个句柄问题,要记住句柄只是操作真正对象的一个句柄,所以默认参数例如
Fun(a=[]):
     a.append(‘ok’)
     Return a
这样你如果每次不带参数调用,几次调用后就会返回[‘ok’,’ok’,]这样的list,这样的结果也不难想到也是对句柄理解问题,所以我们需要思考。因为每次不带参数的话,每次调用的默认句柄,还是括号参数里面的那个[]句柄,没有变过,每次增加都是操纵着同一个地方了。自然多次调用结果返回的list是一样的。
我们可以用不可变对象None来代替,不变对象也利于多线程操作,还不用加锁
Fun(a=None):
     If a is None:
          a=[]
     a.append(‘ok’)
     Return a
可变参数:这个的特点就是可以传入不知道数量的参数,只需参数前面加个*号
Def fun(*para):
     pass
这样的效果很容易就想到是把参数进行了tupe的自动包装,然后传入
如果需要把list或tupe直接传入,加个*,例如:a=[1,2,3]   fun(*a)就可以复用这个函数

关键字参数,就是可以传一个dict进去,代表着可选的,要是直接是dict的话可以直接用**dict来调用
这时候感觉就有点繁琐的语法了,要用时候再查吧,要知道有这个能直接方便传可变的dict数量进去的参数就行了

还有一个叫命名关键字的,就是传入关键字参数可以指定key,然后它们参数放置顺序还有一些规则,这些太细的东西就自己查吧,不然掉进语法细节无法抽身了。其实感觉这些什么关键字参数的用处可能不是很多。(这个说法有待考证)
递归函数什么的没什么好说,这个不管任何语言都差不多,主要看理解和思维方式

                                                       python高级语法规则
到这个层面应该都是语法糖的东西了,用起来好用方便些简洁优雅的东西了。有些能少打一些代码。
第一个切片
     这个好理解,其实就是别的语言string操作中的substring操作,不过这个python可利用这个特性的我猜想都是继承了iterator接口的东西,也就是可迭代对象,这样就很容易知道,str,list,tupe这三个肯定是支持的了,这三个都支持,dict从逻辑分析,应该不能支持,应为dict里面压根就是无序的,它主要用到的就是查找快,hashmap
下面展示切片的几个用法:
     a=[1,2,3,4,5]
     a[:4]默认从0下标开始,没写就是默认,然后第二个当然就是结束下标,当然这里也是符合C传承下来的左闭又开原则,右开就是下标为4取不到,这里我想引申一些东西,就是左闭右开为啥这样设计的,据我之前看到的一本经典C书中,有这么一段思想,我觉得蛮有道理的,她说的是左闭右开很方便计算元素的个数,直接右下标-左开始下标就是个数。想想有理有据,令人辛福。
当然切片也可以从倒数开始一如之前list,tupe那般灵活
例如:a[0:-1],这样可以,a[-2:]这样也行,真是灵活,具体结果就是你猜想那样了。自己打下练练手也好
 a[:]这样甚至能复制一个对象,这里竟然不是复制句柄,而是直接复制一个对象出来,自己可实验。经我实验,结果是直接复制一个list出来,就是说,我在复制出来的对象操作不会影响我本来的数据。
还可以每隔几个就取一个数据,语法糖为:a[0::2]这个结果就是[1,3,5],后面是每隔两个取一个元素的意思。
有了这个切片,subString()这个函数的功能基本被取代,str确实也是这样。还有能简化很多循环操作。

第二个:迭代
这个没啥好说的,实现了iteratable接口就可以进行迭代,然后说下如何判断是否是iterable对象呢,有没有一点印象,如果能联想起来说明记忆力不错。没错就是那个isinstance函数,或者说关键字,可以用isinstance([1,2,3],iterable)来判断,返回的是bool值

第三个:列表生成式
看完这个你可能觉得python真特么灵活,没错,它就是灵活,代码短小著称的。不过不合规范也造成难以理解的问题。
这个列表生成器顾名思义就是生成列表的,而且生成的是可变的list,虽然能够通过几个循环产生同样的效果,不过短小的列表生成器看起来还是如此简洁优美。
例子:
生成[1,4,9,16,25,....]的List直到下标达到100
可以这样生成[x*x for  x in range(100)]即可
产生效果如下:



然后加以引申可以加上判断:
[x*x for x in range(10) if x%2==0] 思考下就知道这是产生偶数的平方list,range在10以内的





然后可以猜到的是里面的x是表示一个变量,那么我们可不可以用两个变量,然后加上多一个循环呢,就是两个循环,这也是可以的,多个循环也可以,不过一般不超过两个了,为了可理解性
[{x,y} for x in ‘ABC’ for y in ‘xyz’]没错这是产生’ABC’和’xyz’的{x,y}dict的全排列
结果如下:





是不是觉得惊呆了,如此简洁如此有力的列表生成器就是如此灵活。


第四个:生成器

这个生成器也是生成一个list的,不过这个与列表生成式最主要的区别,主要就是这个生成器是调用一次就产生一个结果,一次一个结果,只有前面结果出来了,才产生后面的结果,这个的主要用途考虑到列表生成式的生成不可控,是一下子生成完所有结果,然后会占用大量内存。这个就不会这个一个一个生成。其实仔细想想,这个属性和我一个循环计数控制差距在哪呢。我感觉没啥差距了,这个也不是那么直观和方便吧。

还是介绍下:
列表生成式变为一个个产出的列表生成器 外面改为括号就可以
例如:t= (x*x for x in range(10))这个就是列表生成器,外面改成[]就一下子产生结果。
而列表生成器也是iterable类型可以用
     For  a in t:
               Print(a) 输出所有结果,也可以自己调用next(t)产生,不过到结尾时会抛出一个没有元素的异常,需要自己捕获

另外函数也可以改装成列表生成器,一个个产生结果
def fun():
       a,b=0,1
      while true:
            yeild b
            a,b=a,a+b
 这样也变成一个列表生成器了,特点就是每次调用next时候,在yeild地方停止,然后输出b,接着下次在yeild地方继续执行。
这个自我感觉用起来费劲,不如for 循环计数来的粗暴直观
第五:迭代器
直接调过,没啥好说,前面说的有些了,具体可以自己查
值得注意的是Iterator和Iterable的差别,Iterator支持惰性运算即可以一个接着下一个运算。


                                                  函数式编程
函数式编程,这个就是把函数当做参数传进函数里面,形成一个高阶的函数。听说过一个观点,函数式编程由于只要输入一样,输出就是固定的。都是局部变量特别使用并发,不用控制锁,同步等,被称为没有副作用。只要输入是一样的,输出必然一样。python前面说过了,可以把函数赋值给一个变量,然后变量使用函数,这个变量也可以传进一个函数里面,从而形成高级函数。

在这个函数式编程的思想指导下,我们有了几个由此产生的很好用的工具,体会函数式编程的思想是关键。参数是函数,只有函数与函数之间的作用,最后产生一个结果,没有类变量也就没有同步问题,多线程等问题

map函数
map函数接受两个输入,一个是函数,一个是Iterator,然后产生另外一个经过映射的函数每个Iterator里面每个序列产生的Iterator,一想这个和列表生成式几乎一样啊。但是值得注意的首先,map(f,iterator),第一个需要是函数才行,第二个iterator产生出来的map对象相当于一个惰性的生成器,需要手动调用next(g)才产生下一个结果,想想这个又跟生成器有点像,但值得注意的是这个序列每个元素都执行在一个函数f上。确实跟生成器有些像。
还有可以通过list(map)把这个惰性运算的结果,全部运算出来封装成一个list.
这个map值得思考作用,函数式编程的思想。map别和dict搞混了,一个是数据结构dict,一个是产生器一样的东西map,
通过type函数可以查看不同对象类型,正所谓一切皆对象。

还有reduce函数,类似的,就是把函数效果叠加在每个序列数产生的结果上
还有filter ,看名字就知道过滤器。
还有sorted,这些函数的特点都是把一个函数当做参数作用在一个高阶函数上。


接着就是其他语言例如java也有的,匿名函数,还有各种类的定义方法。和各种模块的使用。静通python主要指的是这些模块能否使用自如了吧。不过还是那句话,善于解决遇到问题,善于利用工具才是王道。接下去的总结,未完待续了。(可能后面没心情,也不会再续了,这些总结内容已经把python基本语法走了一遭了,python高级语法糖里面有比较多能让代码变得简洁的东西,前面的语法好像和java等语言差距不大,不过更灵活一些)