zip
for (chan, color) in zip(chans, colors):
chans is list, colors is tuple.
chan and color are the elements of them, string or ndarray 。。。
if else
a = True
if a:
print('right')
elif ~a:
print('v')
else:
print('error')
for i in range(7):
print(i)
a=10
if a==10: a=20
python没有switch
while
while a==10:
a+=1
for
fruits=['a','b','c']
for fruit in fruits:
print(fruit)
#break continue pass
函数
# 定义函数
def printme(str):
"打印任何传入的字符串"
print(str)
str;
return
# 调用函数
printme("我要调用用户自定义函数!")
必备参数:
def printme( str ):
printme('a');
关键字参数:
def printme( str ):
printme( str = "My string");
默认参数:
def printinfo( name, age = 35 ):
printinfo( name="miki" );
不定长参数:
def printinfo( arg1, *vartuple ):
printinfo( 70, 60, 50 );
匿名函数
sum = lambda arg1, arg2: arg1 + arg2;
print "相加后的值为 : ", sum( 10, 20 )
class C(object):
@staticmethod
def f(): print('runoob');
C.f(); # 静态方法无需实例化,不需要self参数
cobj = C()
cobj.f() # 也可以实例化后调用
class A(object):
bar = 1
def func1(self): print ('foo')
@classmethod#不需要实例化,不需要self参数,但要有cls参数
def func2(cls):print('123')
a=A()
a.func1()
A.func2()
使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
- @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
- @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
try except
#触发异常
def mye( level ):
if level < 1:
raise Exception("Invalid level!")
# 触发异常后,后面的代码就不会再执行
try:
mye(0) # 触发异常
except Exception as err:#python2 是Exception, err
print (1,err)
else:
print (2)
#用户自定义异常
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
try:
raise Networkerror("Bad hostname")
except Networkerror as e:
print (e.args)
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。
类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
self是类的实例
class WebwxLogin(object):
def __init__(self):
self.wxsid = ''
def getUUID(self):
url = 'https://login.weixin.qq.com/jslogin'
迭代器:iter 和 next
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器先创建iter() ,后调用 next()。
字符串、元组、列表、字典、集合都可以创建迭代器。
import sys
a = {'Tom', 'Jim'}
b=iter(a)
#方式一
for i in b:
print(i)
#方式二
while True:
try:
print(next(b))
except StopIteration:
sys.exit()
区别于items
字典:
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
print(k, v)
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration#防止无限循环
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
生成器:yield
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a #返回一个迭代器
a, b = b, a + b
counter += 1
f = fibonacci(1000) # f 是一个迭代器,由生成器返回生成
while True:
try:
print(next(f), end=" ")
# 遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值,
# 并在下一次执行 next() 方法时从当前位置继续运行。
except StopIteration:
sys.exit()
面向对象
http://www.runoob.com/python3/python3-class.html
类
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法:类中定义的函数。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法
- 类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
- 类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。
- 类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
类的专有方法:
- __init__ : 构造函数,在生成对象时调用
- __del__ : 析构函数,释放对象时使用
- __repr__ : 打印,转换
- __setitem__ : 按照索引赋值
- __getitem__: 按照索引获取值
- __len__: 获得长度
- __cmp__: 比较运算
- __call__: 函数调用
- __add__: 加运算
- __sub__: 减运算
- __mul__: 乘运算
- __truediv__: 除运算
- __mod__: 求余运算
- __pow__: 乘方
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。
类变量和实例变量的区别:https://www.cnblogs.com/crazyrunning/p/6945183.html
类创建:
class MyClass:
#基本属性
i = 12345
Num=0
#定义私有属性,私有属性在类外部无法直接进行访问
__CantSeeMe=10
def f(self):
return 'hello world'
#构造函数,在实例时自动被调用
def __init__(self, num):
self.Num = num
# 实例化类
x = MyClass(200)
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.Num)
print("MyClass 类的方法 f 输出为:", x.f())
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。self代表类的实例,而非类。self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的。
继承和多态
在同1个命名空间:
class DerivedClassName(BaseClassName,BaseClassName2):
def __init__(self,n,a,w,g):
#调用父类的构函
BaseClassName2.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
# 用子类对象调用父类已被覆盖的方法
super(Child, c).myMethod()
在不同命名空间:class DerivedClassName(modname.BaseClassName):
重写:
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
#函数重写
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
#运算符重写
def __add__(self, other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2, 10)
v2 = Vector(5, -2)
print(v1 + v2)