欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Quick_Python_4

程序员文章站 2022-05-04 19:00:01
...

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,如这里的namescore。有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self为默认参数,不需要传递;

3—> print_score这个函数,在类里也称方法,做了一件我们称之为“数据封装”的事情。Student类中,每个实例就拥有各自的namescore这些数据。既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了;

4—> me = Student('Yuntian', 99)这行代码中,我们使用Student这个类实例化了一个me对象。并依据2中所要求的,传入namescore两个参数;

5—> print('Yuntian.name =', me.name)print('Yuntian.score =', me.score)所做的事情是一致的,那就是访问实例化的对象me的属性,并打印出来,可以看到运行结果的确如此;

6—> me.print_score()访问实例化的对象me的方法,并打印出来,由于之前做好了数据封装,且self为默认参数,因此我们在此不需要传递任何参数。

呼!有些多哈,可以多看几遍,加深理解。不过无论如何,我们已经实现一个类,并用它实例化了一个对象,还访问了对象的属性和方法!值得庆贺!希望你以后尝试用类做更有益的事情~~~

我们的第五课结束啦,Quick_Python_4 !

这一课是不是一遍难以消化呢?没关系,那就多看几遍,再自己改改代码,运行理解。这一课,我们的核心围绕函数与类,结合实例进行了讲解。

接下来的一课,同样硬核而重要。我将告诉你Python如此强大而充满活力的秘诀之一!期待的话,就耐心等待明天的学习吧!

相关标签: Python 教程

推荐阅读