Python学习笔记

1.用notepad++时的缩进问题

Python中由于省略了许多符号,所以要严格依靠缩进来控制代码的结构。

所以缩进是十分重要的,大家一般看Python教学的时候都是推荐用4个空格,确实是这样。

但是我用notepad++写的时候遇到了一个问题就是用4个空格写完缩进以后,回车,那么下一行他会帮你自动缩进对不对?这个缩进默认是用的tab,但是如果你没有将tab设置为用4个空格代替的话,就会出现空格tab混用的情况。其实处理这种情况很简单:

只要在设置->首选项->语言->制表符宽度4,下面替换为空格打钩就可以了。

2.关于调用外部函数

如同c语言中的#include <math.h>,Python中需要做的是就是在开头写上import math,但是之后会有所不同比如调用sqrt()这个函数,c就可以直接调用了,但是Python的module并不会把里面的东西自动放到global,可以理解为还有一层命名空间。那么这里有三种解决方案:
1.调用sqrt的时候这么写:math.sqrt()
但如果需要多次调用每次都加math就显得很麻烦,那么第二个方案就是:
2.在前面加上from math import sqrt,这样就可以直接在后面用sqrt()了
那么,如果我不止想用math中的一个函数呢?难道我要from math import sqrt    from math import cos()    from math import.....
显然这样是不科学的,那么只需要在最前面from mathimport *就可以了,*代表math中的所有内容,这就是第三种方案。


3.等待并输入一个字符

opencv中对cvWaitkey函数的定义如下:

int cvWaitKey( int delay=0 )

返回值为int型,函数的参数为int型,当delay小于等于0的时候,如果没有键盘触发,则一直等待,此时的返回值为-1,否则返回值为键盘按下的码字;当delay大于0时,如果没有键盘的的触发,则等待delay的时间,此时的返回值是-1,否则返回值为键盘按下的码字。

4.Python中的字符数字转化

一、python中字符串转换成数字

(1)import string 

tt='555'

ts=string.atoi(tt)

ts即为tt转换成的数字

转换为浮点数 string.atof(tt)

(2)直接int

int(tt)即可。

二、数字转换成字符串

tt=322

tem='%d' %tt

tem即为tt转换成的字符串

5.Python几种连接字符串方式

第一种,用加号相连,没有空格

‘hello’+‘adam’=‘helloadam’

第二种,逗号相连,中间有空格

‘hello’,‘adam’=‘hello adam’

第三种,C风格,格式化字符串

(%s---%s%(‘hello’,‘adam’))=‘hello---adam’

第四种,列表连接

L=['bart','robert','danniel']

identifier=‘&&’

identifier.join(L)='bart&&robert&&danniel'

第五种,*号

str=‘abc’

str=str*2

str=‘abcabc’


好吧,有点乱,但我想在这里补充一些python中string大小写转换的函数

capitalize() 首字母大写,其余全部小写 

upper() 全转换成大写

lower() 全转换成小写

title()  标题首字大写,如"i love python".title()  "I love python"



6.Python 引用自定义模块

当引用模块时,编译器会先在当前目录,接着去sys.path、Python的安装目录去寻找你引用的模块,如果没有的话,就会报错。

所以,如果要引用的模块在其他地方需要这么做

import sys

sys.path.append(<路径名>)

然后在引用你想引用的模块


7.高级特性:切片(应用的数据结构为list or tuple)

对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。

格式是这样的[x:y:z],x为起始索引,y为结束索引(不包含y),索引可以用负索引,z为每z个取一个。

切片的一个强大功能[::-1]实现倒序排列

8.高级特性:迭代(应用数据结构Iterable)、迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

那么如何判断一个类型可不可以迭代?

>>>import collections

>>>isinstance('abc', collections.Iterable)

True

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

>>> for i, value in enumerate(['A', 'B', 'C']):
...     print(i, value)
9.高级特性:生成器

如果说list存放的是数据,那么generator存放的就是算法,对于一个无限长的list来说存放生成它的算法是最好的选择。第一种定义生成器的方法是用()代替[],另一种是在函数中加入yield,用于每次接受next,生成器通过next(),来不断获取下一个元素,直到抛出StopIteration异常。

这里分享一个杨辉三角的生成器,每次返回杨辉三角的一行list

def Yanghui():

L=[1]

while True:

yield L

L=[1]+[L[i]+L[i+1] for i in range(0,len(L)-1)]+[1]

10.装饰器

在代码运行期,动态增加功能的方式称为装饰器。本质上装饰器就是一个返回函数的高阶函数。

11.偏函数

偏函数的作用就是把函数中的某些参数的默认值固定下来,返回一个新的函数,使得对于这个函数的调用更加简洁。

12.模块

一个.py文件就称之为一个模块

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

首先一般模块内最前边都会有这两个注释,第一个指定在unix和类unix系统中用什么解释器来执行,第二个设置编码。

然后,任何模块第一个字符串都被视为模块的文档注释。可以用__doc__访问,__author__变量,好吧,直译就是作者。

当然以上这些东西你完全可以不写,但这就是一个规范的模板,让你看上去更加有规范。


在模块内,变量或者函数有作用域的概念用下划线_来实现。加了下划线就是private作用域,外面不建议引用,因为并没有强制规定不可以引用,但最好不要。

__XXX__这种属于特殊变量,有着一些特殊的作用,比如__author__, __doc__, __name__, __main__

额,还有一个东西就是:

if  __name__=='__main__'

这个是用来测试你所编写的模块的,在你测试的时候会执行这里面的东西,但当你在其他模块import该模块的时候,这里面的东西就不会执行,好吧,说白了,如果这个模块作为主函数入口的话就执行,否则,不执行。

13.动态语言的“鸭子类型”

“鸭子类型”的语言是这么推断的:一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,那它就可以被当做鸭子。也就是说,它不关注对象的类型,不要求严格的继承关系,而是关注对象具有的行为(方法)。

14.python类的变量和方法的动态绑定

如果需要给类的一个实例绑定新的属性,那么直接写就好了比如有个类的实例,原来是没有name属性的,现在我写s.name='string',好了那么现在实例s有了name属性。

给一个实例绑定方法还是对于实例s,绑定s.function,这么做

>>>from typed import MethodType

>>>s.function=MethodType(function,s)

function是一个已经定义好的函数

为了给所有的实例,都动态绑定一个方法,那就要在类上面绑定方法,比如Student类,就是Student.method=method

如果要限制类的属性就用__slots__=('name','age'),这样就只能绑定这两个属性,如果子类没有定义slots那么这个对子类不起作用,如果子类定义了,那么就是这个加上子类自己定义的对子类起限制作用。

15.@property的应用

在java中,为了封装信息,我们通常会把一个变量设成private,然后通过get和set方法来获取,和赋值,但这样书写上有点反人类,我们更希望写成我们本希望的那样,那么我们就只需要在get方法前面加@property,之后如果想设置成可写的话,那么在set方法前加一个@属性名.setter,那么就可以用我们希望的那样也就是等号来进行赋值,直接写变量名来获取。

16.类的实例方法、类方法和静态方法

实例方法传入一个隐含参数self代表实例本身,只能由实例本身来调用。类方法在方法前加@classmethod修饰,传入隐含参数cls代表类本身。静态方法加@staticmethod修饰,不传入任何隐含参数。嗯,从形式上来说,这三个方法的区别是这样的。

17.关于Except的一些知识

其中所有的异常的父类都是BaseException,logging模块通过loggin.exception(e),可以方便地打印错误信息,通过配置,还可以把错误记录到日志文件,方便日后排查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值