《想到啥写啥》

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/github_38976972/article/details/79627989

最近在搞毕业设计,总是要用重复的东西。比如上次要用到的函数的使用方法,或者使用函数过程当中一些不为人知的小问题的解决方法。当时好不容易查到的,后来遇到了,又得重新查。一直想着做笔记,但是纸质的只能管当时的最多一个月前后。所以还是在网上随便写一点,又方便。后面把 Vamei 大神写的摘抄下来了。

1. 在处理带有NAN值数据的时候,比如有时候你想求它的均值,一般用np.nanmean是可以解决的,直到后来我发现对于 大于1 的矩阵,用np.nanmean 计算时,结果会显示 Inf。这个时候可以把原矩阵的值先除到小于1再计算;

2.Python当中几个比较容易忘的但是又有丶重要的特殊方法。

1) 有关yield 关键字;

        一般是用来构造生成器。

def gen():
    for i in range(4):
        yield i

生成器的编写方法和函数定义类似,只是在return的地方改为yield。生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。生成器自身又构成一个循环器,每次循环使用一个yield返回的值。

2) 一些特殊方法;

其实在 fluent python里面讲的特别详细,但是不经常见的话比较容易忘记。

__getitem__;用于索引,例如 list[index] 就是调用 该方法。

__getattr__; 得到属性值。

我印象中好像还有个__getattribute__, 二者又有什么区别呢?

整个过程是先用__dict__搜查属性,如果没有,向上找__base__的属性。如果整个树的没有,那么调用__getattr__来生成属性。所以说__dict__和__getattr__是相互配合工作的关系。

而__getattribute__则是无条件的返回属性,无论这一属性是否存在,所以比较“暴力”。

(__getattribute__特殊方法,用于查询任意属性。__getattr__只能用来查询不在__dict__系统中的属性)

__setattr__(self, name, value)和__delattr__(self, name)可用于修改和删除属性。它们的应用面更广,可用于任意属性。


3) 属性;

我们知道,对象的属性一般是保存在__dict__中。这是一种静态的存储方式,还有另外一种就是property。又叫特性,是一种特殊的属性。

特性使用内置函数property()来创建。property()最多可以加载四个参数。前三个参数为函数,分别用于处理查询特性、修改特性、删除特性。最后一个参数为特性的文档,可以为一个字符串,起说明作用。

4)闭包;

闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。

不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。

一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在Python中,所谓的闭包是一个包含有环境变量取值的函数对象。

4) 装饰器;

装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。

闭包,装饰器当初看的时候一头包,现在闭包能理解了,这个装饰器还是一头雾水。今天必须把它拿下!

哈哈。刚才琢磨了一下,终于弄懂了。原来这一切都是套路啊。

装饰器这玩意儿感觉就是个搞装修的。你在装饰器内的内部函数用的参数,和返回的值都是根据你要装饰的函数来定义的,比如你要装饰 sum(x, y)这个函数,那么你的装饰器的内部函数参数就是(x, y),并且返回值就是 return sum(x, y), 当然在装饰器里面写作 return f(x, y)。都是套路。那么它的本质就是:“Python中的变量名和对象是分离的。变量名可以指向任意一个对象。从本质上,装饰器起到的就是这样一个重新指向变量名的作用(name binding),让同一个变量名指向一个新返回的可调用对象,从而达到修改可调用对象的目的。

现在懂了装饰器的主要作用了,就是你原来的函数或者类,你要修改它或者添加功能会很麻烦, 这是装饰器就牛逼了。你把原来要修改的函数或者类传入装饰器,对它自身原来的代码没有任何影响,就是相当于换了一个名字,换的名字还是原来的名字,只不过这个名字是装饰器内部传给不原来函数或者原来类的,意思就是 function = decorator(function), 不过你得到的是装饰器内部的函数的名称,其实可以理解为 偷梁换柱, 狸猫换太子,虽然从外面看,好像没发生什么,可以说是“暗度陈仓了”。

5) str的两个方法;

str.strip([sub])   去掉开头和结尾的空格,给提供sub参数,去掉开头和结尾的sub

str.split(分隔符, 次数)   顾名思义

6) repr和str的区别;

__repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员。

  • 打印操作会首先尝试__str__和str内置函数(print运行的内部等价形式),它通常应该返回一个友好的显示。

  • __repr__用于所有其他的环境中:用于交互模式下提示回应以及repr函数,如果没有使用__str__,会使用print和str。它通常应该返回一个编码字符串,可以用来重新创建对象,或者给开发者详细的显示。

7)动态类型;

引用和对象分离,是动态类型的核心。引用可以随时指向一个新的对象:

列表可以通过引用其元素,改变对象自身(in-place change)。这种对象类型,称为可变数据对象(mutable object),词典也是这样的数据类型。

而像之前的数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象(immutable object)

我们之前学的元组(tuple),尽管可以调用引用元素,但不可以赋值,因此不能改变对象自身,所以也算是immutable object.

函数的参数传递,本质上传递的是引用。比如说:

参数x是一个新的引用,指向a所指的对象。如果参数是不可变(immutable)的对象,a和x引用之间相互独立。对参数x的操作不会影响引用a。这样的传递类似于C语言中的值传递。

如果传递的是可变(mutable)的对象,那么改变函数参数,有可能改变原对象。所有指向原对象的引用都会受影响,编程的时候要对此问题留心。

8)pickle 模块 是干嘛的?

   glob.glob(path)  查询目录下的文件   和 os.listdir()   很类似

   shutil 模块 用来复制文件用的 虽然现在基本没用到过。

   pickle 将python对象转换为文本流;   pickle.dumps() ;  pickle.loads();  Cpickle 速度是 pickle的一千倍;

9)动态类型;

   不可变数据对象传入函数时,它们将当作函数的局部变量;如果需要,则声明 global object;

   如果是可变数据对象,可直接传入函数;

10)


展开阅读全文

没有更多推荐了,返回首页