Quick_Python_4
Quick_Python_4
Markdown By 云天
Function
在Python中,有丰富的内置函数供你使用。当然,你也可以定义属于自己的函数。相较于C语言,这个过程简洁得多,观察下面这个自定义的实现加法功能的函数:
自定义函数以def
开头,你可以用其英文来理解:define a function。add
是我们自定义函数的函数名,括号内是传入的参数。输入“:
”后敲击回车键,IDE会自动帮你空出四格,你开始编写你要实现的功能:这里return x + y
返回传入的两个参数的和。
调用函数时,输入函数名和对应的参数,我们在终端打印出结果:
def add(x, y):
return x + y
print(add(3,3.7))
6.7
OK,这就是自定义函数的基本实现方法,你可以尝试更复杂的自定义函数,不过殊途同归。接下来,我补充一个关于变量作用域的知识点:
观察以下例程和打印的结果,尝试总结规律:
# Function scope
x = 5
def setX(num):
x = num # => 43
print (x) # => 43
setX(43)
print(x)
43
5
函数体内外都出现了变量x。然而,通过打印的结果,我们可以看出:函数体内的x仅作用于函数体内,它被赋予的值并不改变函数体外x的值。
再观察以下例程和打印的结果,尝试总结规律:
x = 5
def setGlobalX(num):
global x
print (x) # => 5
x = num
print (x) # => 6
setGlobalX(6)
print(x)
5
6
6
关注这行代码:global x
这句代码将x声明为全局变量。我们分析上述程序的运行逻辑:
1—> 定义变量x,并赋值为5;
2—> 自定义函数setGlobalx,传入参数num;
3—> 声明x为全局变量,第一次打印x为5;
4—> 将传入的参数值赋值给x,第二次打印x为传入的参数值6;
5—> 由于x已经被声明为全局变量,因此函数体内发生的变化也将保持下去,第三次打印x为6。
除了def的自定义函数方法之外,Python还支持一种lambda定义方法。lambda函数也叫匿名函数,即没有具体名称的函数,它允许快速定义单行函数。你可以将它视作一个表达式,在定义简单函数时考虑这种简洁的方法。当然,如果程序较为复杂,还是使用def比较合适。
虽然lambda看起来非常简洁,不过也具有一些缺陷,比如lambda函数不能共享给别的程序调用,但def可以。
g = lambda x:x*2
g(3)
6
(lambda x: x > 2)(3)
True
刚刚我们提到,你可以将lambda函数视作一个表达式。因此,它可以直接作为list和dict的元素,而def函数不具有这样的性质。例程如下:
list_a = [lambda a: a**3, lambda b: b**3]
print(list_a[0])
g = list_a[0]
print(g(2))
<function at 0x0259B8B0>
8
Class
Object-oriented programming languages
Object → Attribute & Method
首先,我要放两句凝练过的话在这里,请你多读几遍,在以后的学习实践中反复品味:
1—> 类是对象的抽象,对象是类的实例化;
2—> 创建了类,便可以实例化一个对象。有了对象,便有了属性和方法可用。
重要的事情再说一遍,以上两句很重要哦!
下面的例程,便比较完整地教会你创建一个类,用类实例化一个对象,并访问对象的属性和方法:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('{} gets {}!'.format(self.name, self.score))
# Use class Student to create a object called me
me = Student('Yuntian', 99)
# visit the attribute of the object
print('Yuntian.name =', me.name)
print('Yuntian.score =', me.score)
# visit the method of the object
me.print_score()
Yuntian.name = Yuntian
Yuntian.score = 99
Yuntian gets 99!
这个代码直接理解可能有些难度,我来做一些讲解:
1—> 首先,我们创建一个名为Student
的类。()中的参数表示该类是从哪个类继承下来的,通常,如果没有合适的继承类,就使用object
类,这是所有类最终都会继承的类;
2—> 我们可能注意到__init__
这个略独特的写法,init的前后分别是两个下划线。这个函数的参数有三个,其中第一个self
为默认的参数,指向创建的实例本身。在__init__
方法内部,可以把各种属性绑定到self
,如这里的name
和score
。有了__init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__
方法匹配的参数,但self
为默认参数,不需要传递;
3—> print_score
这个函数,在类里也称方法,做了一件我们称之为“数据封装”的事情。Student
类中,每个实例就拥有各自的name
和score
这些数据。既然Student
实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student
类的内部定义访问数据的函数,这样,就把“数据”给封装起来了;
4—> me = Student('Yuntian', 99)
这行代码中,我们使用Student这个类实例化了一个me对象。并依据2中所要求的,传入name
和score
两个参数;
5—> print('Yuntian.name =', me.name)
,print('Yuntian.score =', me.score)
所做的事情是一致的,那就是访问实例化的对象me的属性,并打印出来,可以看到运行结果的确如此;
6—> me.print_score()
访问实例化的对象me的方法,并打印出来,由于之前做好了数据封装,且self
为默认参数,因此我们在此不需要传递任何参数。
呼!有些多哈,可以多看几遍,加深理解。不过无论如何,我们已经实现一个类,并用它实例化了一个对象,还访问了对象的属性和方法!值得庆贺!希望你以后尝试用类做更有益的事情~~~
我们的第五课结束啦,Quick_Python_4 !
这一课是不是一遍难以消化呢?没关系,那就多看几遍,再自己改改代码,运行理解。这一课,我们的核心围绕函数与类,结合实例进行了讲解。
接下来的一课,同样硬核而重要。我将告诉你Python如此强大而充满活力的秘诀之一!期待的话,就耐心等待明天的学习吧!
推荐阅读