鸭子类型
动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。
编程语言中的鸭子类型 https://www.cnblogs.com/jaw-crusher/p/3475868.html
鸭子类型 https://www.cnblogs.com/zzyzz/p/7723272.html
C++泛型与多态(4): Duck Typing https://www.jianshu.com/p/4939c934e160
Python中列表元素转为数字
numbers = ['1', '5', '10', '8'];
方法一:
numbers = [ int(x) for x in numbers ]
方法二:
umbers = list(map(int, numbers))
for _ in range(10):
Python中对于无需关注其实际含义的变量可以用_代替,这就和for i in range(5)一样,因为这里我们对i并不关心,所以用_代替仅获取值而已。
Pyhton 单行、多行注释符号使用方法及规范
python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的。python注释也有自己的规范,在文章中会介绍到。注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被多人调用,为了让别人能更容易理解代码的通途,使用注释是非常有效的。
一、python单行注释符号(#)
在代码中使用#时,它右边的任何数据都会被忽略,当做是注释。
二、批量、多行注释符号
在python中也会有注释有很多行的时候,这种情况下就需要批量多行注释符了。多行注释是用三引号''' '''包含的
三、python中文注释方法
在python编写代码的时候,避免不了会出现或是用到中文,这时候你需要在文件开头加上中文注释。比如创建一个python list,在代码上面注释上它的用途,如果开头不声明保存编码的格式是什么,那么它会默认使用ASKII码保存文件,这时如果你的代码中有中文就会出错了,即使你的中文是包含在注释里面的。所以加上中文注释很重要。
#coding=utf-8
或者:
#coding=gbk
玩蛇网Python之家提示:以上两种都可以代表中文注释,我看过的更多人使用urf-8这种的比较多。
一个好的程序员,为代码加注释是必须要作的。但要确保注释要说的都是重要的事情,像看一眼就知道是干什么的,无用的代码是不需要加注释的。
arcpy窗口中 Shell里 控制台 换行 Shift+Enter 或Ctrl+Enter
连续点击两下回车键,运行脚本
Python 区分大小写
python中self和__init__的含义+ 为何要有self和__init__
在Python中的类Class的代码中,常看到函数中的第一个参数,都是self。
以及Class中的函数里面,访问对应的变量(读取或者写入),以及调用对应的函数时,都是self.valueName self.function()的形式。
self,英文单词意思很明显,表示自己,本身。此处有几种潜在含义:
1.这里的自己,指的是,实例Instance本身。
2.同时, 由于说到“自己”这个词,都是和相对而言的“其他”而说的。而此处的其他,指的是,类Class,和其他变量,比如局部变量,全局变量等。此处的self,是个对象,Object。是当前类的实例。因此,对应的self.valueName self.function()中的valueName:表示self对象,即实例的变量。与其他的,Class的变量,全局的变量,局部的变量,是相对应的。function:表示是调用的是self对象,即实例的函数。与其他的全局的函数,是相对应的。
在类的代码(函数)中,需要访问当前的实例中的变量和函数的,即,访问Instance中的:
对应的变量(property):Instance.ProperyNam,去读取之前的值和写入新的值
调用对应函数(function):Instance.function(),即执行对应的动作
-> 而需要访问实例的变量和调用实例的函数,当然需要对应的实例Instance对象本身
-> 而Python中就规定好了,函数的第一个参数,就必须是实例对象本身,并且建议,约定俗成,把其名字写为self
-> 所以,我们需要self(需要用到self)
而如果没有用到self,即代码中,去掉self后,那种写法所使用到的变量,实际上不是你所希望的,不是真正的实例中的变量和函数,而是的访问到了其他部分的变量和函数了。
甚至会由于没有合适的初始化实例变量,而导致后续无法访问的错误。
下面,就通过代码,来演示,如果去掉self,或者没有合理的使用self,会出现哪些错误。
如果没有在__init__中初始化对应的实例变量的话,导致后续引用实例变量会出错
python列表怎么纵向输出
列表里面有“,”就是告诉print不要 往stdout里面输出换行符。
Python中创建数组
使用array函数创建时,参数必须是由方括号括起来的列表,而不能使用多个数值作为参数调用array。
>>> a = array(1,2,3,4) # 错误
>>> a = array([1,2,3,4]) # 正确
可使用双重序列来表示二维的数组,三重序列表示三维数组,以此类推。
Python主函数
初次接触Python的人会很不习惯Python没有main主函数。 以下面的程序为例:
其中if__name__=="__main__":这个程序块类似与Java和C语言的中main(主)函数在Cmd中运行结果
C:\work\python\divepy>python hello.py
main
function
在Python Shell中运行结果
>>> import hello
>>> hello.foo()
function
>>> hello.__name__
'hello'
>>>
可以发现这个内置属性__name__自动的发生了变化。这是由于当你以单个文件运行时,__name__便是__main__
当你以模块导入使用时,这个属性便是这个模块的名字。
Instance attribute attribute_name defined
outside __init__
Traceback (most recent call
last): 运行出现了错误,错误跟踪信息如下 错误捕捉
PEP是 Python Enhancement Proposal的缩写,翻译过来就是Python增强建议书
python expected 2 blank lines,found 1 什么意思
这是PEP8的规范,一般是指在本函数前面应当有两个空行。应该是对函数的格式规范。函数上面要空两行
python中from pylab import *是什么意思
* 代表所有,就是从pylab中导入所有的非私有类,函数,全局变量等。
python读取文件的几种方式
- read_csv 从文件,url,文件型对象中加载带分隔符的数据。默认分隔符为逗号
- read_table 从文件,url,文件型对象中加载带分隔符的数据。默认分隔符为制表符(“\t”)
- read_fwf 读取定宽列格式数据(也就是没有分隔符)
- read_cliboard 读取剪切板中的数据,可以看做read_table的剪切板。在将网页转换为表格时很有用
二、文件的读取步骤:打开 -- 读取 -- 关闭
>>> f = open('/tmp/test.txt')
>>> f.read()
'hello python!\nhello world!\n'
>>> f.close()
读取数据是后期数据处理的必要步骤。.txt是广泛使用的数据文件格式。一些.csv, .xlsx等文件可以转换为.txt 文件进行读取。我常使用的是Python自带的I/O接口,将数据读取进来存放在list中,然后再用numpy科学计算包将list的数据转换为array格式,从而可以像MATLAB一样进行科学计算。
下面是一段常用的读取txt文件代码,可以用在大多数的txt文件读取中
filename = 'array_reflection_2D_TM_vertical_normE_center.txt' # txt文件和当前脚本在同一目录下,所以不用写具体路径
pos = []
Efield = []
with open(filename, 'r') as
file_to_read:
while True:
lines = file_to_read.readline() # 整行读取数据
if not lines:
break
pass
p_tmp,
E_tmp = [float(i) for i in lines.split()] # 将整行数据分割处理,如果分割符是空格,括号里就不用传入参数,如果是逗号, 则传入‘,'字符。
pos.append(p_tmp)
# 添加新读取的数据
Efield.append(E_tmp)
pass
pos = np.array(pos) # 将数据从list类型转换为array类型。
Efield = np.array(Efield)
pass
Python pass是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句。
代码中经常会有变量是否为None的判断,有三种主要的写法:
第一种是`if x is None`;
第二种是 `if not x:`;
第三种是`if not x is None`(这句这样理解更清晰`if not (x is None)`) 。
`if x is not None`是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。
使用if not x这种写法的前提是:必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。
#读取txt文档的某一列,python一行流
a=[float(l.split()[10])for lin open('d:/1.txt')]
读取数据是后期数据处理的必要步骤。.txt是广泛使用的数据文件格式。一些.csv, .xlsx等文件可以转换为.txt 文件进行读取。我常使用的是Python自带的I/O接口,将数据读取进来存放在list中,然后再用numpy科学计算包将list的数据转换为array格式,从而可以像MATLAB一样进行科学计算。
命令行退出python方法
在Windows中,按Ctrl+Z,再按回车退出,或者按Ctrl+C直接退出;
在Linux中,按Ctrl+D退出
Python中上下文管理器(Context Manager)
写代码时,我们希望把一些操作放到一个代码块中,这样在代码块中执行时就可以保持在某种运行状态,而当离开该代码块时就执行另一个操作,结束当前状态;所以,简单来说,上下文管理器的目的就是规定对象的使用范围,如果超出范围就采取“处理”。
“End of statement expected ” string syntax error in python
I have the following variableassignment:
xpath_query="xpath='//a[@id="mylink"]'"
This is giving me an error in mypycharm editor and giving a syntax error when I run this code. What am I doingwrong?
when I hold the cursor over the redsquiggle it says:"end of statement expected "
Youhave double quotes inside your " " block. so it becomes:
"xpath='//a[@id="<-- stick together with --> "]'"
Henceit is a string syntax error.
To include " inside " " block,
you can use \toescape the character:
xpath_query="xpath='//a[@id=\"mylink\"]'"
python基础-对数
import math # 需要导入模块Module: math
a=math.log(c,b) #计算以c为底,b的对数:
a=math.log(b) # 当参数c缺省,默认取自然对数
自然对数e是一个无限不循环小数,其值约等于2.718281828459…,它是一个超越数。
注意区分ln 和lg
Python: 3行代码实现txt文件转csv
Python里换行输出多个变量
print(a, b, sep=’\n’)
Python3的字符串的编码语言用的是unicode编码,由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干字节,如果要在网络上传输,或保存在磁盘上就需要把str变成以字节为单位的bytes
python对bytes类型的数据用带b前缀的单引号或双引号表示:
'ABC'
b'ABC'
要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显得和前者一样,但bytes的每个字符都只占用一个字节
Python入门之列表生成式
1. 生成列表
要生成list [1, 2,3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11):
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但如果要生成[1x1, 2x2,3x3, …, 10x10]怎么做?方法一是循环:
>>> L = []
>>> for x in range(1, 11):
... L.append(x * x)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
这种写法就是Python特有的列表生成式。利用列表生成式,可以以非常简洁的代码生成 list。
写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。
例如:
利用列表生成式生成列表 [1x2, 3x4,
5x6, 7x8, …, 99x100]。提示:range(1, 100, 2) 可以生成list [1, 3, 5, 7, 9,…]
方法:
print [x*(x+1) for x in range(1,100,2)]
列表生成式的 for 循环后面还可以加上 if 判断。例如:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
如果我们只想要偶数的平方,不改动 range()的情况下,可以加上 if 来筛选:
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
有了 if 条件,只有 if 判断为 True 的时候,才把循环的当前元素添加到列表中。
例如:
请编写一个函数,它接受一个 list,然后把list中的所有字符串变成大写后返回,非字符串元素将被忽略。
提示:
isinstance(x, str) 可以判断变量 x 是否是字符串;
2. 字符串的 upper() 方法可以返回大写的字母。
方法:
def toUppers(L):
return [x.upper() for x in L if isinstance(x,str)]
print toUppers(['Hello', 'world', 101])
链表推导式提供了一个创建链表的简单途径,无需使用 map(), filter() 以及 lambda。返回链表的定义通常要比创建这些链表更清晰。每一个链表推导式包括在一个for语句之后的表达式,零或多个for或if语句。返回值是由for或if子句之后的表达式得到的元素组成的链表。如果想要得到一个元组,必须要加上括号。
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]
>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]
>>> [[x,x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]
>>> [x, x**2 for x in vec] # error - parens required for tuples
File "", line 1, in ?
[x, x**2 for x in vec]
^
SyntaxError: invalid syntax
>>> [(x, x**2) for x in vec]
[(2, 4), (4, 16), (6, 36)]
>>> vec1 = [2, 4, 6]
>>> vec2 = [4, 3, -9]
>>> [x*y for x in vec1 for y in vec2]
[8, 6, -18, 16, 12, -36, 24, 18, -54]
>>> [x+y for x in vec1 for y in vec2]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
>>> [vec1[i]*vec2[i] for i in range(len(vec1))]
[8, 12, -54]
为使链表推导式匹配for循环的行为,可以在推导之外保留循环变量:
>>> x = 100 # this gets overwritten
>>> [x**3 for x in range(5)]
[0, 1, 8, 27, 64]
>>> x # the final value for range(5)
摘自
Python handbook
Guido van Rossum
Fred L. Drake,Jr., editor
对高维数组的操作
当诸如 min, max 等函数对高维数组进行操作时,有时希望对整个数组进行该操作,有时则希望对每一行进行该操作。使用axis 参数可以指定函数的行为:
m = rand(3,3)
m.max() # global max
m.max(axis=0) # max in each column
m.max(axis=1) # max in each row
提示错误:SyntaxError: EOL while scanning string literal
语法错误:End of Line 行结束
zip()函数用法
用法一:在运算时,会以一个或多个序列做为参数,返回一个元组的列表。同时将这些序列中并排的元素配对。
在python 3.0中zip()是可迭代对象,使用时必须将其包含在一个list中,方便一次性显示出所有结果
zip()参数可以接受任何类型的序列,同时也可以有两个以上的参数;当传入参数的长度不同时,zip能自动以最短序列长度为准进行截取,获得元组。
a =[1,2,3]
b =[4,5,6]
list(zip(a,b))
>>>[(1, 4), (2, 5), (3, 6)]
用法二:搭配for循环,支持并行迭代操作方法
l1 =[2,3,4]
l2 =[4,5,6]
for(x,y) in zip(l1,l2):
printx,y,'--',x*y
24--8
35--15
46--24
其实它的工作原理就是使用了zip()的结果,在for循环里解包zip结果中的元组,用元组赋值运算。就好像(x,y)=(2,6),赋值、序列解包操作。在对文件的操作中我们也会用到遍历,例如Python遍历文件夹目录与文件操作,就是很方便实用的。
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough tobreak the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse thetemptation to guess.
There should be one-- and preferably onlyone --obvious way to do it.
Although that way may not be obvious atfirst unless you're Dutch.
Now is better than never.
Although never is often better than *right*now.
If the implementation is hard to explain,it's a bad idea.
If the implementation is easy to explain,it may be a good idea.
Namespaces are one honking great idea --let's do more of those!
网友评论