定义python中的函数和类

1.函数

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回

1.1 定义函数

def showshow(sex):
	if sex==1:
		return 'man'
	else:
		return 'lady'
#调用
print(showshow(2))

注意一下不是function是def

1.2 函数的参数

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

这个基本上和php的差不多, 这里的参数 n 设置了默认值。

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。这样子可以能降低调用函数的难度

如果要参数是list,可以这样做:

def addsomthing(s=[]):
	s.append('jack')
	return s
print(addsomthing(['tom','jj']))

这里有一个特别需要注意的地方

pythond有一个奇异现象,在模块层面定义的变量(无需global修饰),如果在函数中没有再定义同名变量,可以在函数中当做全局变量使用

hehe=6
def f():
    print(hehe)
f()
print(hehe) 
#输出6和6

但如果在函数中有再赋值/定义(因为python是弱类型语言,赋值语句和其定义变量的语句一样),则会产生引用了未定义变量的错误:

hehe=6
def f():
    print(hehe)
    hehe=2
f()
print(hehe) 

抛出的错误信息为:

UnboundLocalError: local variable 'hehe' referenced before assignment

正确的做法是:

hehe=6
def f():
    global hehe
    print(hehe)
    
f()

1.3 递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

def sumfun(n):
	if n==1:
		return 1
	else:
		return  n+sumfun(n-1)
print(sumfun(3))
##结果##
6

上面演示实现 3 +2 +1 算法。

2.类

2.1 类的结构

一个比较典型的打印学生成绩类

class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name, self.score))

ob = Student()
ob.print_score()

在Python中,定义类是通过class关键字

由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去。

注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身,这个方法大概就像php的构造函数吧

有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

2.2 访问限制

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:

class Student(object):
    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:

>>> bart = Student('Bart Simpson', 59)
>>> bart.__name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名

2.3 继承和多态

一个比较典型的类继承,基本上和php差不多

class Car(object):
	def run(self):
		print('i can run very fast!')
	
class Honda(Car):
	def go(self):
		print('vtec is the best')

b=Honda()
b.go()
b.run()

这里的子类Honda继承了Car这个父类,所以能使用run这个方法

继承有什么好处?最大的好处是子类获得了父类的全部功能。由于Car实现了run()方法,因此,Honda作为它的子类,什么事也没干,就自动拥有了run()方法。

同时你可以重写父类里的run方法:

class Car(object):
	def run(self):
		print('i can run very fast!')
	
class Honda(Car):
	def go(self):
		print('vtec is the best')
    
    def run(self):
		print('Honda can run very fast')

b=Honda()
b.go()
b.run()

下面是关于多态:

class Animal(object):
    def run(self):
        print('Animal is running...')
	

class Dog(Animal):

    def run(self):
        print('Dog is running...')

    def eat(self):
        print('Eating meat...')

class Cat(Animal):

    def run(self):
        print('Cat is running...')

class Rabbit(Animal):
	pass

a = Dog()
a.run()

b = Cat()
b.run()

def run_twice(animal):
    animal.run()
    animal.run()

run_twice(Cat())
#Cat is running...
#Cat is running...
run_twice(Rabbit())
#Animal is running...
#Animal is running...

上面是一个多态的典型代码.

由于dog类和cat类都是 继承了Animal类

在python里 dog和cat都是 Animal类型

要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样:

a = list() # a是list类型
b = Animal() # b是Animal类型
c = Dog() # c是Dog类型 ,同时c也是Animal类型

多态的好处就是,当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思。

来一句大神的一句话总结:

派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿John

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值