(2)Python基础:函数,类,面向对象

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)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值