Linux系统与大数据应用 课件 第7章 Linux系统下的Python基础_第1页
Linux系统与大数据应用 课件 第7章 Linux系统下的Python基础_第2页
Linux系统与大数据应用 课件 第7章 Linux系统下的Python基础_第3页
Linux系统与大数据应用 课件 第7章 Linux系统下的Python基础_第4页
Linux系统与大数据应用 课件 第7章 Linux系统下的Python基础_第5页
已阅读5页,还剩129页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux系统与大数据应用1Linux系统概述第章本章内容1.1认识Linux系统1.2

Linux系统的发展1.3Ubuntu介绍1.4Linux系统下大数据平台1.5本章小结7.1Linux中的Python

Python的优点1.简单、易学:Python程序看上去简单易懂,python虽然是用c语言写的,但是它摈弃了c中非常复杂的指针,简化了python的语法。2.面向对象:Python既支持面向过程的函数编程也支持面向对象的抽象编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。3.可移植性:由于它的开源本质,Python已经被移植在许多平台上,经过改动使它能够在不同平台上工作。如果你不使用Python对系统依赖的特性,那么所有Python程序无需修改就可以在下述任何平台上面运行。7.1Linux中的Python

Python的优点4.自由、开源:Python是开放源码软件之一。你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。Python具有超高的灵活性、应用性。5.可扩展性和可嵌入性:如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。6.丰富的库:Python标准库十分庞大。python有可定义的第三方库可以使用。它可以处理各种工作,除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。7.1Linux中的Python

Python的缺点1.运行速度慢:java和c都是编译型语言,Python是解释型语言。编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。2.不能加密:因为Python是开源性的编程语言,所以在源代码的保密方面有很大的问题。7.1Linux中的Python

第一个Python小程序o打开Ubuntu终端,输入python(该Ubuntu版本为16.04,Python版本为2.7.12)o输入print(‘helloPython’)oPrint(‘helloPython’)o输出结果为:helloPython7.1Linux中的Python

第一个Python小程序【例7-1】定义两个整型变量并做乘法运算:在编译过程中,python会记住你定义、赋值的所有变量,按Ctrl+D退出后,python会释放所有变量和命令。7.1Linux中的Python

lPython是一个python的交互式shell,比默认的pythonshell好用得多,支持变量自动补全,自动缩进,支持bashshell命令,内置了许多很有用的功能和函数。(在Python3.0版本中Ubuntu系统自带IPython,而Python2.7版本中IPython需要自行安装,下面介绍在Python2.7版本中如何安装IPython)。

IPython安装

打开终端,输入命令行sudoaptinstallpython-pip

sudoaptinstallpython-pip输入命令行sudoaptinstallipythonsudoaptinstallipython输入ipython进入应用界面(按Ctrl+D可以退出IPython)

lPython工具7.2.1基本数据类型计算机可以处理数值以及视频、音频、图片、文字等各种各样的数据,在Python中可以直接识别的基本类型有整型、浮点型、字符串。这三种数据类型将在下面用实例进行讲解。7.2.1基本数据类型基本数据类型整型:Python可以处理任意大小的整数,在程序中的表示方法和数学上的写法一模一样,通常被称为是整型或整数,是正或负整数,不带小数点。例如:1、10、100、-1、0浮点型:浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,例如:1.1、2.2.在命令中用float定义浮点型。长整型:无限大小的整数,整数最后是一个大写或小写的L。复数:复数的虚部以字母J或

j结尾

。如:2+3i字符串:字符串是以单引号或双引号括起来的任意文本,比如'a',"b"等等。请注意,单引号或双引号本身只是一种表示方式,不是字符串的一部分。

如果‘或“为字符串的一部分,需要输出‘或“,需要把‘或“包含在单引号或者双引号之内,但是需要注意不能包含相同的引号。

print(“i’magoodboy”)

输出结果为:

i'magoodboy

如果字符串中既包含单引号又包含双引号,需要转义字符‘\’,如下:

print(“i\’magoodboy”)

输出结果为:

i'magoodboy

转义字符可以转义很多字符,转义字符‘\’本身也同样需要转义,‘\n’表示换行,‘\t’表示制表符。如下:

print(“\\\n\\”“\t\\”)

输出结果为:

\\ \7.2.1基本数据类型转义字符表,如表7-1所示:表7-1 转义字符表2. Python列表序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字-它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。Python有6个序列的内置类型,但最常见的是列表和元组。序列都可以进行的操作包括索引,切片,加,乘,检查成员。此外,Python已经内置确定序列的长度以及确定最大和最小的元素的方法。列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型。创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。【例7-2】创建列表list1=['python','software',1997,2000];list2=[1,2,3,4,5];list3=["a","b","c","d"];

与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。7.2.1基本数据类型【例7-3】访问列表中的值:使用下标索引来访问列表中的值list1=['python','software',1997,2000];list2=[1,2,3,4,5,6,7];print"list1[0]:",list1[0]print"list2[1:5]:",list2[1:5]

输出结果如图7-3所示:7.2.1基本数据类型【例7-4】更新列表list=['physics','chemistry',1997,2000];print"Valueavailableatindex2:"printlist[2];list[2]=2001;print"Newvalueavailableatindex2:"printlist[2];

输出结果如图7-4所示:7.2.1基本数据类型【例7-5】删除列表元素:可以用del语句删除列表元素list1=['physics','chemistry',1997,2000];printlist1;dellist1[2];print"Afterdeletingvalueatindex2:"printlist1;输出结果如图7-5所示:7.2.1基本数据类型7.2.1基本数据类型在读取列表的元素时,例如:创建一个列表L=[...],L[1]读取的是列表中第二个元素;L[2]读取的是列表中第三个元素;L[-1]读取的是列表中倒数第一个元素。在Python中包含以下函数,如表7-2所示:表7-2python包含的函数函数作用cmp(list1,list2)比较两个列表的元素len(list)统计列表元素个数max(list)返回列表元素最大值min(list)返回列表元素最小值7.2.1基本数据类型函数运行实例如图7-3.7.2.1基本数据类型3. python元组

Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。如下实例:tup1=('physics','chemistry',1997,2000);tup2=(1,2,3,4,5);tup3="a","b","c","d";

创建空元组tup1=();

元组中只包含一个元素时,需要在元素后面添加逗号tup1=(50,);元组与字符串类似,下标索引从0开始,可以进行截取,组合等。(1)访问元组7.2.1基本数据类型【例7-6】元组可以使用下标索引来访问元组中的值。tup1=('physics','chemistry',1997,2000);tup2=(1,2,3,4,5,6,7);print"tup1[0]:",tup1[0]print"tup2[1:5]:",tup2[1:5]

输出结果如图7-7所示:7.2.1基本数据类型(2)修改元组【例7-7】元组中的元素值是不允许修改的,但我们可以对元组进行连接组合.tup1=(12,34.56);tup2=('abc','xyz');#以下修改元组元素操作是非法的。#tup1[0]=100;#创建一个新的元组tup3=tup1+tup2;printtup3;

输出结果如图7-8所示:7.2.1基本数据类型(3)删除元组【例7-8】元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组。tup=('physics','chemistry',1997,2000);printtup;deltup;print"Afterdeletingtup:"printtup;

以上实例元组被删除后,输出变量会有异常信息,输出如图7-9所示:7.2.1基本数据类型(4)元组运算符与字符串一样,元组之间可以使用+号和*号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。元组运算符,如表7-3所示。(5)无关闭分隔符运算符结果作用len((1,2,3))3计算元素个数(1,2,3)+(4,5,6)(1,2,3,4,5,6)连接['Hi!']*4['Hi!','Hi!','Hi!','Hi!']复制3in(1,2,3)True元素是否存在forxin(1,2,3):printx,123迭代表7-3元组运算符7.2.1基本数据类型【例7-9】任意无符号的对象,以逗号隔开,默认为元组.print'abc',-4.24e93,18+6.6j,'xyz';x,y=1,2;print"Valueofx,y:",x,y;

输出结果如图7-10所示:7.2.1基本数据类型4. python字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如下所示:d={key1:value1,key2:value2}

值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。7.2.1基本数据类型【例7-10】输出打印字典中的元素。dict={'Name':'Zara','Age':7,'Class':'First'};print"dict['Name']:",dict['Name'];print"dict['Age']:",dict['Age'];

输出结果如图7-11所示:7.2.1基本数据类型(1)修改字典向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对。【例7-11】修改字典dict={'Name':'Zara','Age':7,'Class':'First'};dict['Age']=8;#updateexistingentrydict['School']="DPSSchool";#Addnewentryprint"dict['Age']:",dict['Age'];print"dict['School']:",dict['School'];

输出结果如图7-12所示: deldict['Name'];删除是'Name'的条目;dict.clear();清空词典所有条目;deldict;删除词典7.2.2流程控制语句1.分支语句在我们学习的C语言中分支语句有if...else、switch...case语句,但是在Python中,只提供if...else语句。下面为大家介绍分支语句的几种控制语句。2.单分支写法一:

if条件:执行语句写法二:

If条件:执行语句件系统的组织者,也是最上级的领导者。首先手动输入命令Is/(打开目录)ls/7.2.2流程控制语句【例7-12】判断指定的uid是不是root用户uid=0ifuid==0:print("root")

输出结果如图7-13所示:7.2.2流程控制语句3.双分支If条件:执行语句else:执行语句【例7-13】根据用户id打印用户身份uid=100ifuid==0:print("root")else:print("Commonuser")输出结果如图7-14所示7.2.2流程控制语句3.多分支If条件:执行语句elif条件1:执行语句elif条件2:执行语句

elif条件n:执行语句else:执行语句7.2.2流程控制语句【例7-14】根据学生分数打印字母等级score=88.8level=int(score%10)iflevel>=10:print('LevelA+')eliflevel==9:print('LevelA')eliflevel==8:print('LevelB')eliflevel==7:print('LevelC')eliflevel==6:print('LevelD')else:print('LevelE')

输出结果如图7-15所示7.2.2流程控制语句4.循环语句Python中提供的循环语句有:while循环和for循环。需要注意的是Python中没有do...while循环。此外,还有几个用于控制循环执行过程的循环控制语句:break、continue和pass。(1)while循环while条件:执行语句(在判断条件为true时,执行循环体)7.2.2流程控制语句【例7-15】循环输出数字0-9count=0whilecount<=9:print(count,end='')count+=1输出结果如图7-16所示:7.2.2流程控制语句

当while的判断一直为true时,while循环体就会无限循环下去。代码如下:whileTrue:print(‘这是死循环’)

输出结果:这是死循环这是死循环这是死循环...

按Ctrl+C可以结束死循环。条件循环语句的的形式和双分支语句类似,由while...else组成,语句形式如下:while条件:执行语句else:执行语句

else中的代码块会在while循环正常执行完的情况下执行,如果while循环被break中断,else中的代码块不会被执行。7.2.2流程控制语句(2)for循环

for临时变量in可迭代变量

【例7-16】打印names中元素。names=['Tom','Peter','Jerry','Jack']fornameinnames:print(name)

输出结果如图7-17所示:7.2.2流程控制语句迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。5.循环控制语句循环控制语句可以更改循环体中程序的执行过程,如中断循环、跳过本次循环。循环控制语句,如表7-4所示。循环控制语句作

用break终止整个循环continue跳过本次循环,执行下一次循环passpass语句是个空语句,只是为了保持程序结构的完整性,没有什么特殊含义。pass语句并不是只能用于循环语句中,也可以用于分支语句中。表7-4循环控制语句7.2.2流程控制语句【例7-17】遍历0-9范围内的所有数字,并通过循环控制语句打印出其中的奇数foriinrange(10):ifi%2==0:continueprint(i,end='')输出结果如图7-18所示:7.2.2流程控制语句【例7-18】通过循环控制语句打印一个列表中的前3个元素names=['Tom','Peter','Jerry','Jack','Lilly']foriinrange(len(names)):ifi>=3:breakprint(names[i])

输出结果如图7-19所示7.2.2流程控制语句6.循环嵌套循环嵌套如其字面意思,在一个循环中嵌入另一个循环。【例7-19】打印输出九九乘法表a=1whilea<=9:i=1whilei<=a:Print(‘%d*%d=%d’%(i,a,i*a)),print(‘‘)a+=1

输出结果为:(图7-20)7.3Python函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。1.函数的命名规则函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;函数名是区分大小写的;函数名不能是保留字。2.函数的定义关键字def用于创建用户自定义函数,函数定义就是一些可执行的语句。defsquare(x):returnx**2函数定义的执行会绑定当前本地命名空间中的函数名(可以将命名空间当作名字到值的一种映射,并且这种映射还可以嵌套,命名空间和范围会在另一个教程中详细介绍)到一个函数对象,该对象是一个对函数中可执行代码的包装器。这个函数对象包含了一个对当前全局命名空间的引用,而当前命名空间指该函数调用时所使用的全局命名空间。此外,函数定义不会执行函数体,只有在函数被调用时才会执行函数体。7.3Python函数3.定义一个函数你可以定义一个由自己想要功能的函数,以下是简单的规则:• 函数代码块以def关键词开头,后接函数标识符名称和圆括号()。• 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。• 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。• 函数内容以冒号起始,并且缩进。• Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None。4.语法deffunctionname(parameters):"函数_文档字符串"function_suitereturn[expression]默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。defprintme(str):"打印传入的字符串到标准显示设备上"printstrreturn7.3Python函数5.函数调用定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。如下实例调用了printme()函数:#Functiondefinitionisheredefprintme(str):"打印任何传入的字符串"printstr;return;

#Nowyoucancallprintmefunctionprintme("我要调用用户自定义函数!");printme("再次调用同一函数");

以上实例输出结果:我要调用用户自定义函数!再次调用同一函数7.3Python函数6.按值传递参数和按引用传递参数所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:defchangeme(mylist):"修改传入的列表"mylist.append([1,2,3,4]);print"函数内取值:",mylistreturnmylist=[10,20,30];changeme(mylist);print"函数外取值:",mylist

传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:函数内取值:[10,20,30,[1,2,3,4]]函数外取值:[10,20,30,[1,2,3,4]]7.3Python函数7.参数以下是调用函数时可使用的正式参数类型:• 必备参数• 命名参数• 缺省参数• 不定长参数• 必备参数7.3Python函数【例7-20】printme()函数的调用必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。调用printme()函数,你必须传入一个参数,不然会出现语法错误:defprintme(str):"打印任何传入的字符串"printstr;return;printme();

输出结果如图7-21所示:7.3Python函数8.关键字参数关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为Python解释器能够用参数名匹配参数值。7.3Python函数【例7-21】在函数printme()调用时使用参数名:defprintme(str):"打印任何传入的字符串"printstr;return;printme(str="Mystring");

输出结果如图7-23所示:7.3Python函数下例能将关键字参数顺序不重要展示得更清楚:defprintinfo(name,age):"打印任何传入的字符串"print"Name:",name;print"Age",age;return;printinfo(age=50,name="miki");

输出结果:Name:mikiAge50

命名参数命名参数和函数调用关系紧密,调用方用参数的命名确定传入的参数值。你可以跳过不传的参数或者乱序传参,因为Python解释器能够用参数名匹配参数值。用命名参数调用printme()函数。7.3Python函数【例7-22】在函数printme()调用时使用参数名:defprintme(str):"打印任何传入的字符串"printstr;return;printme(str="Mystring");

输出结果如图7-24所示:7.3Python函数【例7-23】将命名参数顺序不重要展示得更清楚:defprintinfo(name,age):"打印任何传入的字符串"print"Name:",name;print"Age",age;return;printinfo(age=50,name="miki");输出结果如图7-25所示:7.3Python函数9.缺省参数调用函数时,缺省参数的值如果没有传入,则被认为是默认值。【例7-24】打印默认的age,如:defprintinfo(name,age=35):"打印任何传入的字符串"print"Name:",name;print"Age",age;return;printinfo(age=50,name="miki");printinfo(name="miki");输出结果如图7-26所示:7.3Python函数10.定长参数你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:deffunctionname([formal_args,]*var_args_tuple):"函数_文档字符串"function_suitereturn[expression]7.3Python函数【例7-25】加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。defprintinfo(arg1,*vartuple):"打印任何传入的参数"print"输出:"printarg1forvarinvartuple:printvarreturn;printinfo(10);printinfo(70,60,50);输出结果如图7-27所示:7.3Python函数11.匿名函数

python使用lambda来创建匿名函数。具体要求有以下几点:• lambda只是一个表达式,函数体比def简单很多。• lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。• lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。• 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。12.语法

lambda函数的语法只包含一个语句,如下:lambda[arg1[,arg2,argn]]:expression7.3Python函数

【例7-26】lambda函数sum=lambdaarg1,arg2:arg1+arg2;print"Valueoftotal:",sum(10,20)print"Valueoftotal:",sum(20,20)

输出结果如图7-28所示:7.3Python函数13.return语句

return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值.【例7-27】return语句defsum(arg1,arg2):total=arg1+arg2print"Insidethefunction:",totalreturntotal;total=sum(10,20);print"Outsidethefunction:",total输出结果如图7-29所示7.3Python函数14.变量作用域一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域为:全局变量、局部变量。15.变量和局部变量定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。7.3Python函数【例7-28】变量和局部变量defsum(arg1,arg2):total=arg1+arg2;#total在这里是局部变量.print"Insidethefunctionlocaltotal:",totalreturntotal;sum(10,20);print"Outsidethefunctionglobaltotal:",total输出结果如图7-30所示:7.4Python类和对象Python中的类和对象也有自己的概念,在Python中类就是指种类的意思,例如水中鱼类,鱼类就分为很多种,类中具体的事物又成为某一个对象,我们通常会把具有相同属性和方法的对象归为一类,类是对象的抽象化,那么对象又是类的实例化。类,可以提高将现实关系变成虚拟的逻辑关系的效率,这是由对象的共同特性产生。对象,是不同的事物,如男人和苹果。但是男人和苹果,都有体积、重量等共同特性,所以由这些特性可以合成一个类(也说,抽象成一个类),对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类,这就说明了类与对象的关系。7.4.1面向对象Python本来就是一种为面向对象而设计的语言,所以我们利用Python来创建类和对象是比较容易的,下面就让我们先了解一下面向对象:例如:A同学报道登记信息B同学报道登记信息C同学报道登记信息A同学做自我介绍B同学做自我介绍C同学做自我介绍7.4.1面向对象【例7-29】面向对象:stu_a={"name":"A","age":21,"gender":1,"hometown":"河北"}stu_b={"name":"B","age":22,"gender":0,"hometown":"山东"}stu_c={"name":"C","age":20,"gender":1,"hometown":"安徽"}defstu_intro(stu):"""自我介绍"""forkey,valueinstu.items():print("key=%s,value=%d"%(key,value))stu_intro(stu_a)stu_intro(stu_b)stu_intro(stu_c)7.4.1面向对象面向过程:根据业务逻辑从上到下写代码,面向过程是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程。例如:解决菜鸟买电脑的故事第一种方式:1)在网上查找资料2)根据自己预算和需求定电脑的型号MacBook15顶配1W83)去市场找到苹果店各种店无法甄别真假随便找了一家4)找到业务员,业务员推荐了另外一款配置更高价格便宜也是苹果系统1W5)砍价30分钟付款99996)成交,回去之后发现各种问题第二种方式:1)找一个靠谱的电脑高手

2)给钱交易7.4.1面向对象面向对象和面向过程都是解决问题的一种思路而已,用面向对象的思维解决问题的重点就是,当遇到一个需求的时候不用自己去实现,如果自己一步步实现那就是面向过程、应该找一个专门做这个事的人来做,所以第一种方式就是面向过程而第二种方式就是面向对象,由此可以看出面向对象是基于面向过程的一种方法。面向对象编程至今还没有统一的概念我这里把它定义为:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。面向对象编程是一种解决软件复用的设计和编程方法。这种方法把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。7.4.2类和对象面向对象的编程有两个重要的概念就是:类和对象,对象是面向对象编程的核心,在使用对象的过程中,是为了将具有共同特征和行为的一组对象抽象定义,那么我们提出了另外一个新的概念——类。

1.类和对象:Python中类的构成:类(Class)由3个部分构成:类的名称:类名类的属性:一组数据类的方法:允许对进行操作的方法(行为)

例如:人类设计,只关心3样东西:事物名称(类名):人(Person)属性:身高(height)、年龄(age)方法(行为/功能):跑(run)、打架(fight)

对于类的定义:Class类名:方法列表;7.4.2类和对象【例7-30】定义一个car类:#定义类classCar:#方法defgetCarInfo(self):print('车轮子个数:%d,颜色%s'%(self.wheelNum,self.color))defmove(self):print("车正在移动...")

在python中我们可以根据已经定义的类进行定义对象,创建对象的格式:对象名=类名()7.4.2类和对象【例7-31】创建demo对象:创建对象demo:#定义类classCar://告诉Python我们会在这个位置定义一个类

#移动

defmove(self):print('车在奔跑...')//定义的方法

#鸣笛

deftoot(self):print("车在鸣笛...嘟嘟..")#创建一个对象,并用变量BMW来保存它的引用BMW=Car()BMW.color='黑色'//给对象添加属性BMW.wheelNum=4#轮子数量BMW.move()//调用对象的方法BMW.toot()print(BMW.color)print(BMW.wheelNum)7.4.2类和对象BMW=Car(),这样就产生了一个Car的实例对象,此时也可以通过实例对象BMW来访问属性或者方法。第一次使用BMW.color='黑色'表示给BMW这个对象添加属性,如果后面再次出现BMW.color=xxx表示对属性进行修改。BMW是一个对象,它拥有属性(数据)和方法(函数)。当创建一个对象时,就是用一个模子,来制造一个实物。7.4.3构造函数在上一节的demo中,我们已经给BMW这个对象添加了2个属性,wheelNum(车的轮胎数量)以及color(车的颜色),试想如果再次创建一个对象的话,肯定也需要进行添加属性,显然这样做很费时间,那么有没有办法能够在创建对象的时候,就顺便把车这个对象的属性给设置呢?答案是我们将要利用__init__()方法,def__init__比较特殊而且大部分书中称为初始化函数,我们也更加习惯地称之为构造函数,所谓初始化就是让我们所创建的类有一个基本的面貌,不是那么的空。而它的作用就是在python实例化的时候,要给参数进行赋值,当我们把这种参数传递进去之后就会变为类和实例的一个属性。7.4.3构造函数1.构造函数的定义及使用:(1)__init__方法的使用方法:使用方式:def类名:#初始化函数,用来完成一些默认的设定

def__init__():Pass7.4.3构造函数

【例7-32】__init__()方法的调用:#定义汽车类classCar:def__init__(self):self.wheelNum=4self.color='蓝色'defmove(self):print('车在跑,目标:夏威夷')#创建对象BMW=Car()print('车的颜色为:%s'%BMW.color)print('车轮胎数量为:%d'%BMW.wheelNum)

运行结果如图7-31所示:7.4.3构造函数当创建Car对象后,在没有调用__init__()方法的前提下,BMW就默认拥有了2个属性wheelNum和color,原因是__init__()方法是在创建对象后,就立刻被默认调用,__init__()方法,在创建一个对象时默认被调用,不需要手动调用,__init__(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去7.4.3构造函数(2)【例7-33】定义__str__()方法:classCar:def__init__(self,newWheelNum,newColor):self.wheelNum=newWheelNumself.color=newColordef__str__(self):msg="嘿。。。我的颜色是"+self.color+"我有"+int(self.wheelNum)+"

个轮胎..."returnmsgdefmove(self):print('车在跑,目标:夏威夷')BMW=Car(4,"白色")print(BMW)运行结果如图7-32所示:7.4.3构造函数图7-32定义__str__()方法当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据。下面我们来了解一下类与实例的关系:类提供默认行为,是实例的工厂,所谓工厂就是用同一个模子做出很多的产品,所以我们所定义的类就是那个模子,实例就是具体的产品,所以,实例是程序处理的实际对象。

2.Self的作用:首先明确self只有在类中才会有,独立定义的函数或者方法是不会含有self的,尽管当我们调用的时候不用向self中传递参数,那么有一点我们应该了解在python中self不是必须有的,也不是python中的关键字,类中的函数,第一个参数就是self,classPerson:def_init_(self,name):=namedefsayhello(self):print'Mynameis:',p=Person('Bill')printp根据这个例子我们应该了解到self是指向Person中的实例p的。7.4.3构造函数【例7-34】self的作用:#classAnimal://定义一个类#方法def__init__(self,name):=namedefprintName(self):print('名字为:%s'%)#定义一个函数defmyPrint(animal):animal.printName()dog1=Animal('西西')myPrint(dog1)dog2=Animal('北北')myPrint(dog2)运行结果如图7-33所示:7.4.3构造函数

3.保护对象和私有对象:下面我们要来了解一下保护对象的属性:如果有一个对象,当需要对其进行修改属性时,有2种方法:对象名.属性名=数据>直接修改对象名.方法名()>间接修改为了更好的保存属性安全,即不能随意修改,一般的处理方式为• 将属性定义为私有属性• 添加一个可以调用的方法,供调用7.4.3构造函数

【例7-35】保护对象的属性:classPeople(object):def__init__(self,name):self.__name=namedefgetName(self):returnself.__namedefsetName(self,newName):iflen(newName)>=5:self.__name=newNameelse:print("error:名字长度需要大于或者等于5")xiaoming=People("dongGe")print(xiaoming.__name)运行结果如图7-34所示:7.4.3构造函数【例7-36】私有对象的属性:classPeople(object):def__init__(self,name):self.__name=namedefgetName(self):returnself.__namedefsetName(self,newName):iflen(newName)>=5:self.__name=newNameelse:print("error:名字长度需要大于或者等于5")7.4.3构造函数xiaoming=People("liu")xiaoming.setNam("wanger")print(xiaoming.getName())exiaoming.setName("lisi")print(xiaoming.getName())运行结果如图7-35所示:由于Python中没有像C++中public和private这些关键字来区别公有属性和私有属性,它是以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。7.4.3构造函数

【例7-37】__del__()方法:importtimeclassAnimal(object):#初始化方法

#创建完对象后会自动被调用

def__init__(self,name):print('__init__方法被调用')self.__name=name#析构方法

#当对象被删除时,会自动被调用

def__del__(self):print("__del__方法被调用")print("%s对象马上被删掉了..."%self.__name)7.4.3构造函数#创建对象dog=Animal("某个")#删除对象deldogcat=Animal("那个")cat2=catcat3=catprint("马上删除cat对象")delcatprint("马上删除cat2对象")delcat2print("马上删除cat3对象")delcat3print("程序2秒钟后结束")time.sleep(2)运行结果如图7-36所示:7.4.3构造函数当有某一个变量保存了对象的引用时,此对象的引用计数就会加1。当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除。7.4.4继承1.继承的介绍以及单继承首先我们了解一下什么是继承,生活中在现实生活中,继承一般指的是子女继承父辈的财产,在我们的现实生活中,“继承”就是要意味着一个人要从另一个人那里得到一些东西,总之,“继承”之后,那么在那个所继承的方面,就会省一些力气,如果这个优势体现在代码上,就会提高程序的运行效率。继承是面向软件技术的一种概念。如果一个类别A“继承自”另一个类B,就把这个A称为“B的子类别”,而把B称为“A的父类别”,可以B是A的超类。所以继承就可以使得子类具有父类的各种属性和方法,当子类继承父类的同时也可以同时定义自己的属性和方法,那么当然也可以重写某些属性和方法,由于继承会继承父类的属性和方法,所以可以实现代码的重用,可以高效的实现代码的继承,提高代码的运行效率。单继承的定义方式:class子类(父类)7.4.4继承

【例7-38】继承的定义:classPreson:#父类defspeak(self)print“Iloveyou.”defsetHeight(self,n)self.length=ndefbreast(self,n)print”Mybreastis:”,nclassGirl(Person):#继承的定义defselfHeight(self)7.4.4继承print“theheightis:1.70m”If__name__==”__main__”:cang=Girl()cang.selfHeight()cang.speak()cang.breast(90)运行结果如图7-37所示:7.4.4继承首先定义一个类Person,在类中又定义了三种方法,但是在这个类中并没有定义初始化函数,然后我们紧接着又定义了Girl类,这个类名的后面括号中是上一个类的类名,这是说明Girl继承了Person类,所以Girl是Person类的子类,那么Person类也即是Girl类的父类。既然已经继承Person类,那么Girl就会拥有Person中的属性和方法,但是,如果Girl中有和Person中一样的方法,那么父类中的同一个方法将会被遮盖,那么这就叫做方法的重写。虽然在Girl类中没有speak方法,但是由于继承的原因,在子类中也能进行调用。7.4.4继承继承的注意事项:classAnimal(object):def__init__(self,name='动物',color='白色'):self.__name=nameself.color=colordef__test(self):print(self.__name)print(self.color)deftest(self):print(self.__name)print(self.color)7.4.4继承classDog(Animal):defdogTest1(self):#print(self.__name)#能访问到父类的私有属性

print(self.color)defdogTest2(self):#self.__test()#不能访问父类中的私有方法

self.test()A=Animal()#print(A.__name)#程序出现异常,不能访问私有属性print(A.color)#A.__test()#程序出现异常,不能访问私有方法A.test()print("分割线")D=Dog(name="小花狗",color="黄色")D.dogTest1()D.dogTest2()• 私有的属性,不能通过对象直接访问,但是可以通过方法访问• 私有的方法,不能通过对象直接访问• 私有的属性、方法,不会被子类继承,也不能被访问• 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用。7.4.4继承2.多继承Python中多继承的格式如下:#定义一个父类classA:defprintA(self):print('A')#定义一个父类classB:defprintB(self):print('B')#定义一个子类,继承自A、BclassC(A,B):defprintC(self):print('C')obj_C=C()obj_C.printA()obj_C.printB()7.4.4继承2.多继承Python中多继承的格式如下:#定义一个父类classA:defprintA(self):

【例7-39】多继承的顺序:classP1(object):deffoo(self):print'p1-foo'classP2(object):deffoo(self):print'p2-foo'defbar(self):print'p2-bar'classC1(P1,P2):passclassC2(P1,P2):defbar(self):print'C2-bar'classD(C1,C2):passif__name__=='__main__':printD.__mro__#只有新式类有__mro__属性,告诉查找顺序是怎样的

d=D()d.foo()d.bar()print('A')#定义一个父类classB:defprintB(self):print('B')#定义一个子类,继承自A、BclassC(A,B):defprintC(self):print('C')obj_C=C()obj_C.printA()obj_C.printB()7.4.4继承从我们的运行结果中能够看出:实例d调用foo()时,搜索顺序是D=>C1=>C2=>P1实例d调用bar()时,搜索顺序是D=>C1=>C2总结:新式类的搜索方式是采用“广度优先”的方式去查找属性7.5文件的操作1.什么是文件文件,是电脑中非常重要的东西,在Python中它也是一种类型的对象,它包括文本的、图片的、音频的、视频的等等,还有很多相关的扩展名。其实我们在linux中的操作,都是被保存在文件中,所以,文件在我们的操作系统中能够起到至关重要的作用,能够帮助我们储存一切有用的东西,并且不会丢失。7.5文件的操作2.文件的操作

(1)打开文件在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件open(文件名,访问模式)示例如下:f=open('test.txt','w')访问模式说明,如表7-5所示:7.5文件的操作从表中我们不难看出,如果在不同文件下打开文件,可以进行相关的读写。那么,如果当我们什么模式都不写的时候,那么将会启动默认的r形式,通过只读的方式打开文件。f=open(“130.txt”)f<openfile‘130.txt’,mode‘r’at0x7530230>f=open(“130.txt”,”r”)f<openfile‘130.txt’,mode‘r’at0xb750a700>7.5文件的操作我们可以通过这种方式来查看当前打开的文件是采用什么模式的,如果我们不写“r”,那么就能认为是只读方式了。“w”:以写方式打开文件,可以向文件中继续写进去东西,如果文件是存在的,那么将原文件清空,再次写入新的内容即可。131.txt是我们原来就建立好的,并且还在里面加上一句话:Thisisafilefp=open(“131.txt”)forlineinfp#原来这个文件中的内容...printline...Thisisafilefp=open(“131.txt”,”w”)#这时候再看看这歌文件,里面是否有内容fp.white(“Mynameisqiwsir.\nMywebsiteisqiwsir.github.io”)#再查看内容fp.close()7.5文件的操作查看文件内容:$cat131.txt#cat是linux下显示文件内容的命令,这里就是要显示131.txt内容MynameisqiwsirMywebsiteisqiwsir.github.io

“a”:以追加模式打开文件(即一打开文件,文件指针将会自动的转移到文件的末尾),如果该文件不存在那么就立即创建。fp=open(“131.txt”,”a”)fp.write(“\nAha,Ilikeprogram\n”)#想文件中追加fp.close()#这条语句是用来关闭文件的,当我们写完文件的时候就要及时地将文件关闭。7.5文件的操作

查看文件内容:$cat131.txtMynameisqiwsirMywebsiteisqiwsir.github.ioAha,Ilikeprogram

(2)关闭文件close()

示例如下:#新建一个文件,文件名为:test.txtf=open('test.txt','w')#关闭这个文件f.close()7.5文件的操作3.文件的读写

(1)写数据(write)

使用write()可以完成向文件写入数据

【例7-40】写数据的格式:demo:f=open('test.txt','w')f.write('helloworld,iamhere!')f.close()运行结果如图7-40所示:7.5文件的操作(2)读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据7.5文件的操作【例7-41】读取数据:f=open('test.txt','r')content=f.read(5)print(content)print("-"*30)content=f.read()print(content)f.close()运行结果如图7-41所示:7.5文件的操作(3)读数据(readlines)就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素【例7-42】readlines#coding=utf-8f=open('test.txt','r')content=f.rea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论