python 第六课笔记

 

1、面向对象引子

  你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人,一个是狗,且人和狗都有不同的技能,比如人拿棍打狗,狗可以咬人,怎么描述这种不同的角色和他们的功能呢?你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色:

def person(name,age,sex,job):
    data = {
     ‘name‘:name,
     ‘age‘:age,
     ‘sex‘:sex,
     ‘job‘:job
    }

    return data

def dog(name,dog_type):
    data = {
        ‘name‘:name,
        ‘type‘:dog_type
    }
    return data

  

上面两个方法相当于造了两个模子,游戏开始,你得生成一个人和狗的实际对象吧,怎么生成呢?

d1 = dog("李磊","京巴")

p1 = person("严帅",36,"F","运维")

p2 = person("林海峰",27,"F","Teacher")

  

两个角色对象生成了,狗和人还有不同的功能呀,狗会咬人,人会打狗,对不对? 怎么实现呢, 想到了,可以每个功能再写一个函数,想执行哪个功能,直接调用就可以了,

def bark(d):
    print("dog %s:wang.wang..wang..."%d[‘name‘])

def walk(p):
    print("person %s is walking..." %p[‘name‘])

d1 = dog("李磊","京巴")
p1 = person("严帅",36,"F","运维")
p2 = person("林海峰",27,"F","Teacher")

walk(p1)
bark(d1)

  

上面的功能实现的简直是完美!但是仔细玩耍一会,你就不小心干了下面这件事:

def person(name,age,sex,job):
    def walk(p):
        print("person %s is walking..." % p[‘name‘])

    data = {
        ‘name‘:name,
        ‘age‘:age,
        ‘sex‘:sex,
        ‘job‘:job,
        ‘walk‘:walk
    }

    return data

def dog(name,dog_type):

    def bark(d):
        print("dog %s:wang.wang..wang..."%d[‘name‘])
    data = {
        ‘name‘:name,
        ‘type‘:dog_type,
        ‘bark‘:bark
    }

    return data

d1 = dog("李磊","京巴")
p1 = person("严帅",36,"F","运维")
p2 = person("林海峰",27,"F","Teacher")

d1[‘bark‘](p1) #把人的对象传给了狗的方法

  

你是如此的机智,这样就实现了限制人只能用人自己的功能啦。但,我的哥,不要高兴太早,刚才你只是阻止了两个完全不同的角色之前的功能混用,但有没有可能,同一个种角色,但有些属性是不同的呢?比如,大家都打过cs吧,cs里有警察和恐怖份子,但因为都是人,所以你写一个角色叫 person(), 警察和恐怖份子都可以互相射击,但警察不可以杀人质,恐怖分子可以,这怎么实现呢?你想了说想,说,简单,只需要在杀人质的功能里加个判断,如果是警察,就不让杀不就ok了么。没错,这虽然解决了杀人质的问题,但其实你会发现,警察和恐怖分子的区别还有很多,同时又有很多共性,如果在每个区别处都单独做判断,那得累死。

总结:需要通过面向对象的知识解决更为复杂的一些关系描述。

2、面向过程编程

1、编程范式

  编程是程序用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式,对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式。不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式。两种最重要的编程范式分别是面向过程编程和面向对象编程。

2、面向过程编程(Procedural Programming)

  Procedural programming uses a list of instructions to tell the computer what to do step-by-step. 面向过程编程依赖 - 你猜到了- procedures,一个procedure包含一组要被进行计算的步骤,面向过程又被称为top-down languages就是程序从上到下一步步执行,一步步从上到下,从头到尾的解决问题。基本设计思路就是程序一开始是要着手解决一个大的问题,然后把一个大问题分解成很多个小问题或子过程,这些子过程再执行的过程再继续分解直到小问题足够简单到可以在一个小步骤范围内解决。

①举个典型的面向过程的例子,数据库备份,分三步,连接数据库,备份数据库,测试备份文件可用性,代码如下:

def db_conn():
    print("connecting db...")

def db_backup(dbname):
    print("导出数据库...",dbname)
    print("将备份文件打包,移至相应目录...")

def db_backup_test():
    print("将备份文件导入测试库,看导入是否成功")

def main():
    db_conn()
    db_backup(‘my_db‘)
    db_backup_test()

if __name__ == ‘__main__‘:
    main()

  

  这样做的问题也是显而易见的,就是如果你要对程序进行修改,对你修改的那部分有依赖的各个部分你都也要跟着修改,举个例子,如果程序开头你设置了一个变量值为1 但如果其它子过程依赖这个值为1的变量才能正常运行,那如果你改了这个变量,那这个子过程你也要修改,假如又有一个其它子程序依赖这个子过程那就会发生一连串的影响,随着程序越来越大,这种编程方式的维护难度会越来越高。所以我们一般认为,如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护的,那还是用面向对象最方便了。

时间: 2024-12-14 08:36:17

python 第六课笔记的相关文章

3月机器学习在线班第六课笔记--信息熵与最大熵模型

原文:https://www.zybuluo.com/frank-shaw/note/108124 信息熵 信息是个很抽象的概念.人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少.比如一本五十万字的中文书到底有多少信息量.直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题.(百度百科) 香农定义的信息熵的计算公式如下: H(X)=−∑p(xi)log(p(xi))    (i=1,2,…,n) 其中X 表示的是随机变量,随机变量的取值为(x1,x2,…,xn)

python第四课笔记

请问以下代码会打印多少次"我爱鱼C!" while 'C':        print('我爱鱼C!') 答:无数次 请问以下代码会打印多少次"我爱鱼C!" i = 10    while i:        print('我爱鱼C!')        i = i - 1 答:10次 请写出与 10 < cost < 50 等价的表达式 10 < cost and cost < 50 Python3 中,一行可以书写多个语句吗? 答:可以 用

python 第无课笔记

5.模块详情及import本质 5-1定义 模块用来从逻辑上组织python代码(变量,函数,类,逻辑...),本质就是.py结尾的Python文件.(文件名test.py,对应的模块名:test) 1.定义一个模块module_alex.py 在模块下,定义一变量和一个方法 2.调用模块 同级目录下建立main.py调用module_alex中的变量或者方法 5-2模块导入方法 方法1.导入一个模块 import module_name    #导入一个模块 方法2.导入多个模块 import

python第六课知识点总结

shelve模块 shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式. import shelve d = shelve.open('shelve_test') #打开一个文件 class Test(object): def __init__(self,n): self.n = n t = Test(123) t2 = Test(123334) name = ["alex","rain",&quo

python第六课

1.selenium剩余用法 from selenium import webdriver driver = webdriver.Chrome(r'E:\python\chromedriver_win32\chromedriver.exe') import time try: webdriver.get("https://dig.chouti.com/") driver.implicity_wait(10) login_btn=driver.find_element_by_id('lo

Python第六课(编程语言学习前期)

1.window10环境变量设置 右键我的电脑,选择“属性”,点击“高级系统设置”,然后选中“环境变量”,在“系统变量”的“path”路径加上软件的文件夹路径. 须知:新变量应用:分隔. 2.电脑的三种编码 (1)ascall码:只能识别英文符号,且用8位表示. (2)unicode:又称万国码,支持所有国家的语言,用16位表示. (3)uty8:相当于ascall和Unicode的结合版,支持所有国家的语言,且用最少位数表示. 3.编码的两种执行方式 (1)在cmd中使用python解码器+p

python第三课笔记

以下哪个变量的命名不正确?为什么? (A) MM_520  (B) _MM520_  (C) 520_MM  (D) _520_MM 答:C不正确,不能数字开头 在不上机的情况下,以下代码你能猜到屏幕会打印什么内容吗? >>>myteacher = '小甲鱼' >>>yourteacher = myteacher >>>yourteacher = '黑夜' >>>print(myteacher) 复制代码 答:小甲鱼 在不上机的情况下

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿

七月算法--12月机器学习在线班-第六次课笔记—梯度下降和拟牛顿 七月算法(julyedu.com)12月机器学习在线班学习笔记 http://www.julyedu.com

七月算法-12月机器学习在线班--第十六次课笔记—采样和变分

七月算法-12月机器学习--第十六次课笔记—采样和变分 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 第一部分 采样 引言 为什么要研究采样? 根据采样结果估算分布的参数,完成参数学习. 前提:模型已经存在,但参数未知: 方法:通过采样的方式,获得一定数量的样本,从而学习该系统的参数. 1 采样算法 现需要对概率密度函数f(x)的参数进行估计,若已知的某概率密度函数g(x)容易采样获得其样本,可以如何估计f(x)的参数? g(x)很容