您的位置:首页 > 编程语言 > Python开发

Python学习笔记

2016-12-30 17:03 148 查看
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)操作符,能大大简化这
4000
种操作。

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

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

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

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



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

>>>import
collections

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

True

生成器都是
Iterator
对象,但
list
dict
str
虽然是
Iterable
,却不是
Iterator


list
dict
str
Iterable
变成
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),可以方便地打印错误信息,通过配置,还可以把错误记录到日志文件,方便日后排查。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: