1. 首页
  2. Python

推荐!一文讲解python基础知识

第一章Python的介绍

1、python介绍

一种面向对象,面向函数的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议[2]. Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中[3] 有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

2、Python的历史

自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。

Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是因为它是一个叫Monty Python的喜剧团体的爱好者。

ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是其非开放造成的。Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。

就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。

Python[4] 已经成为最受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。自从2004年以后,python的使用率呈线性增长[5] 。

由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。

说起科学计算,首先会被提到的可能是MATLAB。然而除了MATLAB的一些专业性很强的工具箱还无法替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:

● 首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其绝大多数扩展库。

● 其次,与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。

● 最后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。

3、关键点常识

1、Python的发音与拼写

2、Python的意思是蟒蛇,源于作者喜欢的一部电视剧 (C呢?)

3、Python的作者是Guido van Rossum(龟叔)

4、Python是龟叔在1989年圣诞节期间,为了打发无聊的圣诞节而用C编写的一个编程语言

5、Python正式诞生于1991年

6、 Python的解释器如今有多个语言实现,我们常用的是CPython(官方版本的C语言实现),7、其他还有Jython(可以运行在Java平台)、IronPython(可以运行在.NET和Mono平台)、PyPy(Python实现的,支持JIT即时编译)

8、Python目前有两个版本,Python2和Python3,最新版分别为2.7.13和3.6.2,现阶段大部分公司用的是Python2,Life is shot, you need Python. 人生苦短,我用Python。

9、2018年8月份 编程语言用户量排行榜 :https://www.tiobe.com/tiobe-index/

推荐!一文讲解python基础知识

4、Python优缺点

l 简单————Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。

l 易学————就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。

l 免费、开源————Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。

l 高层语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

l 可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!

l 解释性————这一点需要一些解释。一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。

l 面向对象————Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

l 可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。

l 丰富的库————Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

l 规范的代码————Python采用强制缩进的方式使得代码具有极佳的可读性。

5、Python应用场景

l Web应用开发

Python经常被用于Web开发。比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。Python定义了WSGI标准应用接口来协调Http服务器与基于Python的Web程序之间的通信。一些Web框架,如Django,TurboGears,web2py,Zope等,可以让程序员轻松地开发和管理复杂的Web程序。

l 操作系统管理、服务器运维的自动化脚本

在很多操作系统里,Python是标准的系统组件。 大多数Linux发行版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端下直接运行Python。有一些Linux发行版的安装器使用Python语言编写,比如Ubuntu的Ubiquity安装器,Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编写它的Portage包管理系统。Python标准库包含了多个调用操作系统功能的库。通过pywin32这个第三方软件 包,Python能够访问Windows的COM服务及其它Windows API。使用IronPython,Python程序能够直接调用.Net Framework。一般说来,Python编写的系统管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的shell脚本。

l 科学计算机器学习

NumPy,SciPy,Matplotlib可以让Python程序员编写科学计算程序。

l 服务器软件(网络软件)——阿里云

Python对于各种网络协议的支持很完善,因此经常被用于编写服务器软件、网络爬虫。第三方库Twisted支持异步网络编程和多数标准的网络协议(包含客户端和服务器),并且提供了多种工具,被广泛用于编写高性能的服务器软件。

第二章 python安装下载及基础语法

1、Python的下载

1、python网址:https://www.python.org/

2、anaconda网址:https://www.anaconda.com/

注意:Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。

2、Python的安装

1、Python安装比较简单,只需要双击安装即可,安装比较快(window)

2、anaconda同样是双击安装,但是安装过程的时间比较长,需要很多依赖项(window)

3、Python IDE的安装

1、eclipse插件安装

Help—> eclipse marketplace—> pydev(较慢)

插件包:加压拷贝到eclipse的dropins中,重启即可

2、pycharm安装

傻瓜式安装,创建新的项目的时候直接选择sdk

4、第一个案例程序Python_helloworld

1、在任意的IDE中创建Python项目

2、创建Python file文件

3、输入代码 print(“hello ,python”)

4、右击直接运行,会在控制台看到对应的结果

5、交互式窗口

1、python:在cmd中直接输入python(配置环境变量)

2、ipython:找到对应的ipython的执行文件,直接执行

Ipython:支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数

注意:Python中本身不带有这个ipython的交互,需要自行安装。首先查看计算机中是否包含pip,一般安装完之后有,执行python –m pip install –upgrade pip,先将pip进行更新,然后安装ipython:pip install ipython

6、Python的注释及乱码

1、单行注释:以#开头,#右边的所有东西当做说明,而不是真正要执行的程序,起辅助说明作用

2、多行注释:’’’多行注释’’’可以写多行的功能说明

3、Python乱码问题

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

# -*- coding:utf-8 -*-

# coding=utf-8

7、变量及类型

1、变量的定义

在程序中,有时我们需要对2个数据进行求和,那么该怎样做呢?

大家类比一下现实生活中,比如去超市买东西,往往咱们需要一个菜篮子,用来进行存储物品,等到所有的物品都购买完成后,在收银台进行结账即可

如果在程序中,需要把2个数据,或者多个数据进行求和的话,那么就需要把这些数据先存储起来,然后把它们累加起来即可

在Python中,存储一个数据,需要一个叫做变量的东西:

例如: num1=100

Num2=87

Result=num1+num2

变量三要素:变量的名称,变量的类型,变量的值

2、变量的类型

为了更充分的利用内存空间以及更有效率的管理内存,变量是有不同的类型,如图所示

推荐!一文讲解python基础知识

注意:

整数

Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等。

计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。

浮点数

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23×109和12.3×108是完全相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23×109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。

字符串

字符串是以单引号’或双引号”括起来的任意文本,比如’abc’,”xyz”等等。请注意,”或””本身只是一种表示方式,不是字符串的一部分,因此,字符串’abc’只有a,b,c这3个字符。如果’本身也是一个字符,那就可以用””括起来,比如”I’m OK”包含的字符是I,’,m,空格,O,K这6个字符。

如果字符串内部既包含’又包含”怎么办?可以用转义字符来标识,比如:

'I'm "OK"!'

表示的字符串内容是:

I'm "OK"!

转义字符可以转义很多字符,比如n表示换行,t表示制表符,字符本身也要转义,所以\表示的字符就是,可以在Python的交互式命令行用print()打印字符串看看:

如果字符串里面有很多字符都需要转义,就需要加很多,为了简化,Python还允许用r”表示”内部的字符串默认不转义,可以自己试试:

如果字符串内部有很多换行,用n写在一行里不好阅读,为了简化,Python允许用”’…”’的格式表示多行内容,

布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来

布尔值可以用and、or和not运算。

and运算是与运算,只有所有都为True,and运算结果才是True:

空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型,我们后面会继续讲到。

怎样知道一个变量的类型呢?

在python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了,不需要咱们开发者主动的去说明它的类型,系统会自动辨别

可以使用type(变量的名字),来查看变量的类型

3、常见的数据类型转换

推荐!一文讲解python基础知识

8、标识符和关键字

1、标识符

开发人员在程序中自定义的一些符号和名称,标示符是自己定义的,如变量名 、函数名等

2、标示符的规则

标示符由字母、下划线和数字组成,且数字不能开头。不能有特殊符号:,/,;,#

思考:下面的标示符哪些是正确的,哪些不正确为什么

fromNo12 from#12 my_Boolean my-Boolean Obj2 2ndObj myInt test1 Mike2jack My_tExt _test test!32haha(da)ttint jack_rose jack&rose GUI G.U.I

python中的标识符是区分大小写的

推荐!一文讲解python基础知识

3、命名规则

见名知意

起一个有意义的名字,尽量做到看一眼就知道是什么意思(提高代码可 读性) 比如: 名字 就定义为 name , 定义学生 用 student

驼峰命名法 :

推荐!一文讲解python基础知识

小驼峰式命名法(lower camel case): 第一个单词以小写字母开始;第二个单词的首字母大写,例如:myName、aDog

大驼峰式命名法(upper camel case): 每一个单字的首字母都采用大写字母,例如:FirstName、LastName

不过在程序员中还有一种命名法比较流行,就是用下划线“_”来连接所有的单词,比如send_buf

4、关键字

python一些具有特殊功能的标示符,这就是所谓的关键字

关键字,是python已经使用的了,所以不允许开发者自己定义和关键字相同的名字的标示符

查看关键字:(保留字)

And      as         assert          break             class      continue def

del        elif        else               except           exec       finally     for

from      global     if                  in                  import    is            lambda

not        or          pass              print             raise      return     try

while      with       yield

可以通过以下命令进行查看当前系统中python的关键字:

import keyword

keyword.kwlist
推荐!一文讲解python基础知识

9、输入与输出

1、普通的输出

# 打印提示

    print('hello world') System.out.println

用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出’hello, world’,用代码实现如下:

>>> print('hello, world')

print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:

 >>> print('The quick brown fox', 'jumps over', 'the lazy dog')

The quick brown fox jumps over the lazy dog

print()会依次打印每个字符串,遇到逗号“,”会输出一个空格,因此,输出的字符串是这样拼起来的:

print()也可以打印整数,或者计算结果:

>>> print(300)

300>>> print(100 + 200)

300

因此,我们可以把计算100 + 200的结果打印得更漂亮一点:

>>> print('100 + 200 =', 100 + 200)

100 + 200 = 300

注意,对于100 + 200,Python解释器自动计算出结果300,但是,’100 + 200 =’是字符串而非数学公式,Python把它视为字符串,请自行解释上述打印结果。

2、格式化输出

最后一个常见的问题是如何输出格式化的字符串。我们经常会输出类似’亲爱的xxx你好!你xx月的话费是xx,余额是xx’之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式。

在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

>>> 'Hello, %s' % 'world'

'Hello, world'

>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)

'Hi, Michael, you have $1000000.'

你可能猜到了,%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。

常见的占位符有:

%d 整数

%f 浮点数

%s 字符串

%x 十六进制整数

其中,格式化整数和浮点数还可以指定是否补0和整数与小数的位数:

>>> '%2d-%02d' % (3, 1)

' 3-01'

>>> '%.2f' % 3.1415926

'3.14'

如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串:

>>> 'Age: %s. Gender: %s' % (25, True)

'Age: 25. Gender: True'

有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:

>>> 'growth rate: %d %%' % 7

'growth rate: 7 %'

练习:编写程序

小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出’xx.x%’,只保留小数点后1位:

3、输入

如果要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变量里

1. python2版本中

1.1 raw_input()

在Python中,获取键盘输入的数据的方法是采用 raw_input 函数。

看如下示例:

注意:

raw_input()的小括号中放入的是,提示信息,用来在获取数据之前给用户的一个简单提示

raw_input()在从键盘获取了数据以后,会存放到等号右边的变量中

raw_input()会把用户输入的任何值都作为字符串来对待

1.2 input()

input()函数与raw_input()类似,但其接受的输入作为是表达式。

input()接受表达式输入,并把表达式的结果赋值给等号左边的变量

raw_input()输入的都当成字符串(和Python3的input功能一样)

2. python3版本中

没有raw_input()函数,只有input()

并且 python3中的input与python2中的raw_input()功能一样

10、运算符

1、算术运算符

下面以a=10 ,b=20为例进行计算

推荐!一文讲解python基础知识

2、赋值运算符

推荐!一文讲解python基础知识

3、复合赋值运算符

推荐!一文讲解python基础知识

注意:Python中没有a++,a–,++a,–a等操作

4、逻辑运算符

推荐!一文讲解python基础知识

5、比较(关系)运算符

推荐!一文讲解python基础知识

第三章 Python的逻辑判断和循环

1、if elif else条件判断

计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。

elif是else if的缩写,完全可以有多个elif,所以if语句的完整形式就是:

 if <条件判断1>:

    <执行1>

elif <条件判断2>:

    <执行2>

elif <条件判断3>:

    <执行3>

else:

    <执行4>

比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现:

age = 20

if age >= 18:

    print('your age is', age)

    print('adult')

根据Python的缩进规则,如果if语句判断是True,就把缩进的两行print语句执行了,否则,什么也不做。

也可以给if添加一个else语句,意思是,如果if判断是False,不要执行if的内容,去把else执行了:

age = 3

if age >= 18:

    print('your age is', age)

    print('adult')

else:

    print('your age is', age)

    print('teenager')

注意不要少写了冒号:。

当然上面的判断是很粗略的,完全可以用elif做更细致的判断:

age = 3

if age >= 18:

    print('adult')

elif age >= 6:

    print('teenager')

else:

    print('kid')

if判断条件还可以简写,比如写:

if x:

    print('True')

只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。

2、input陷阱

最后看一个有问题的条件判断。很多同学会用input()读取用户的输入,这样可以自己输入,程序运行得更有意思:

birth = input(‘birth: ‘)

if birth < 2000:

print(’00前’)

else:

print(’00后’)

输入1982,结果报错:

这是因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python提供了int()函数来完成这件事情:

 s = input('birth: ')

birth = int(s)

if birth < 2000:

    print('00前')

else:

    print('00后')

再次运行,就可以得到正确地结果。但是,如果输入abc呢?又会得到一个错误信息:

Traceback (most recent calllast):

  File "<stdin>", line 1, in <module>

ValueError: invalid literal forint() with base 10: 'abc'

原来int()函数发现一个字符串并不是合法的数字时就会报错,程序就退出了。

如何检查并捕获程序运行期的错误呢?后面的错误和调试会讲到。

3、if嵌套的格式

 if 条件1:

满足条件1 做的事情1

满足条件1 做的事情2

...(省略)...

if 条件2:

满足条件2 做的事情1

满足条件2 做的事情2

...(省略)...

说明:

外层的if判断,也可以是if-else

内层的if判断,也可以是if-else

根据实际开发的情况,进行选择

3、情节描述:上公交车,并且可以有座位坐下

要求:输入公交卡当前的余额,只要超过2元,就可以上公交车;如果空座位的数量大于0,就可以坐下

4、循环结构

1、循环介绍

要计算1+2+3,我们可以直接写表达式:

>>> 1 + 2 + 3=6

要计算1+2+3+…+10,勉强也能写出来。

但是,要计算1+2+3+…+10000,直接写表达式就不可能了。

为了让计算机能计算成千上万次的重复运算,我们就需要循环语句。

Python的循环有两种,一种是for…in循环,另外一种是while循环。

2、while循环

while循环的格式

while 条件:

        条件满足时,做的事情1

        条件满足时,做的事情2

        条件满足时,做的事情3

        ...(省略)...

pass 和while没有关系

while循环应用

1. 计算1~100的累积和(包含1和100)

参考代码如下:

#encoding=utf-8

i = 1

sum = 0

while i<=100:

    sum = sum + i

    i += 1

print("1~100的累积和为:%d"%sum)

2. 计算1~100之间偶数的累积和(包含1和100)

1、循环次数(while中循环次数由条件决定)

2、在循环过程中做什么

3、变量怎么变化?

3、while循环嵌套

前面学习过if的嵌套了,想一想if嵌套是什么样子的?

类似if的嵌套,while嵌套就是:while里面还有while

<1>while嵌套的格式

while 条件1:

条件1满足时,做的事情1

条件1满足时,做的事情2

条件1满足时,做的事情3

…(省略)…

while 条件2:

条件2满足时,做的事情1

条件2满足时,做的事情2

条件2满足时,做的事情3

…(省略)…

4、for循环

像while循环一样,for可以完成循环的功能。

在Python中 for循环可以遍历任何序列的项目,如一个列表或者一个字符串等。

for循环的格式

for 临时变量 in 列表或者字符串等:

循环满足条件时执行的代码

else:

循环不满足条件时执行的代码

5、break和continue

1、break

在循环中,break语句可以提前退出循环。例如,本来要循环打印1~100的数字:

n = 1

while n <=100:

print(n)

n = n + 1

print('END')

上面的代码可以打印出1~100。

如果要提前结束循环,可以用break语句:

n = 1

while n <= 100:

if n > 10: # 当n = 11时,条件满足,执行break语句

break # break语句会结束当前循环print(n)

n = n + 1

print('END')

执行上面的代码可以看到,打印出1~10后,紧接着打印END,程序结束。

可见break的作用是提前结束循环。

2、continue

在循环过程中,也可以通过continue语句,跳过当前的这次循环,直接开始下一次循环。

n = 0

while n < 10:

n = n + 1

print(n)

上面的程序可以打印出1~10。但是,如果我们想只打印奇数,可以用continue语句跳过某些循环:

 n = 0

while n < 10:

    n = n + 1

    if n % 2 == 0: # 如果n是偶数,执行continue语句continue# continue语句会直接继续下一轮循环,后续的print()语句不会执行print(n)

执行上面的代码可以看到,打印的不再是1~10,而是1,3,5,7,9。

可见continue的作用是提前结束本轮循环,并直接开始下一轮循环。

6、小结

循环是让计算机做重复任务的有效的方法。

break语句可以在循环过程中直接退出循环,而continue语句可以提前结束本轮循环,并直接开始下一轮循环。这两个语句通常都必须配合if语句使用。

要特别注意,不要滥用break和continue语句。break和continue会造成代码执行逻辑分叉过多,容易出错。大多数循环并不需要用到break和continue语句,上面的两个例子,都可以通过改写循环条件或者修改循环逻辑,去掉break和continue语句。

有些时候,如果代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时可以用Ctrl+C退出程序,或者强制结束Python进程。

第四章 集合类型

1、字符串

1、下标索引

所谓下标,就是编号,就好比超市中的存储柜的编号,通过这个编号就能找到相应的存储空间

字符串实际上就是字符的数组,所以也支持下标索引。

如果有字符串:name = ‘abcdef’,在内存中的实际存储如下:

推荐!一文讲解python基础知识

如果想取出部分字符,那么可以通过下标的方法,(注意python中下标从 0 开始)

   name = 'abcdef'

   print(name[0])

   print(name[1])

   print(name[-2])

2、切片(分片)

切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。

切片的语法:[起始:结束:步长]

步长:表示下标变化的规律。

注意:选取的区间属于左闭右开型,即从”起始”位开始,到”结束”位的前一位结束(不包含结束位本身)。

我们以字符串为例讲解。

如果取出一部分,则可以在中括号[]中,使用:

name = 'abcdef'

print(name[0:3]) # 取 下标0~2 的字符

name = 'abcdef'

print(name[0:5]) # 取 下标为0~4 的字符

name = 'abcdef'

print(name[3:5]) # 取 下标为3、4 的字符

name = 'abcdef'

print(name[2:]) # 取 下标为2开始到最后的字符

name = 'abcdef'

print(name[1:-1]) # 取 下标为1开始 到 最后第2个  之间的字符

>>> a = "abcdef"

>>> a[:3]

'abc'

>>> a[::2]

'ace'

>>> a[5:1:2]

''

>>> a[1:5:2]

'bd'

>>> a[::-2]

'fdb'

>>> a[5:1:-2]

'fd'

3、字符串常见操作

如有字符串mystr = ‘hello world and bjsxt yunshuxueyuan sxt beijing’,以下是常见的操作

<1>find == java Indexof方法

检测 str 是否包含在 mystr中,如果是返回开始的索引值,否则返回-1

mystr.find(str, start=0, end=len(mystr))

<2>index

跟find()方法一样,只不过如果str不在 mystr中会报一个异常.

mystr.index(str, start=0, end=len(mystr))

<3>count

返回 str在start和end之间 在 mystr里面出现的次数

mystr.count(str, start=0, end=len(mystr))

<4>replace

把 mystr 中的 str1 替换成 str2,如果 count 指定,则替换不超过 count 次.

mystr.replace(str1, str2, mystr.count(str1))

<5>split

以 str 为分隔符切片 mystr,如果 maxsplit有指定值,则仅分隔 maxsplit 个子字符串

mystr.split(str=” “, 2)

<6>capitalize

把字符串的第一个字符大写

mystr.capitalize()

<7>title

把字符串的每个单词首字母大写

<8>startswith

检查字符串是否是以 obj 开头, 是则返回 True,否则返回 False

mystr.startswith(obj)

<9>endswith

检查字符串是否以obj结束,如果是返回True,否则返回 False.

mystr.endswith(obj)

<10>lower

转换 mystr 中所有大写字符为小写

mystr.lower()

<11>upper

转换 mystr 中的小写字母为大写

mystr.upper()

<12>ljust

返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串

mystr.ljust(width)

<13>rjust

返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串

mystr.rjust(width)

<14>center

返回一个原字符串居中,并使用空格填充至长度 width 的新字符串

mystr.center(width)

<15>lstrip

删除 mystr 左边的空白字符

mystr.lstrip()

<16>rstrip

删除 mystr 字符串末尾的空白字符

mystr.rstrip()

<17>strip —java trim

删除mystr字符串两端的空白字符

<18>rfind

类似于 find()函数,不过是从右边开始查找.

mystr.rfind(str, start=0,end=len(mystr) )

<19>rindex

类似于 index(),不过是从右边开始.

mystr.rindex( str, start=0,end=len(mystr))

<20>partition

把mystr以str分割成三部分,str前,str和str后

mystr.partition(str)

<21>rpartition

类似于 partition()函数,不过是从右边开始.

mystr.rpartition(str)

<22>splitlines

按照换行符分隔,返回一个包含各行作为元素的列表

mystr.splitlines()

<23>isalpha

如果 mystr 所有字符都是字母 则返回 True,否则返回 False

mystr.isalpha()

<24>isdigit

如果 mystr 只包含数字则返回 True 否则返回 False.

mystr.isdigit()

<25>isalnum

如果 mystr 所有字符都是字母或数字则返回 True,否则返回 False

mystr.isalnum()

<26>isspace

如果 mystr 中只包含空格,则返回 True,否则返回 False.

mystr.isspace()

<27>join

mystr 中每个字符后面插入list的每个元素后面,构造出一个新的字符串

mystr.join(list)

总结:

查找字符串:

find:找不到返回-1 ,都是从左边找,右边查找r

index:找不到报错

2、列表

1、列表介绍

Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。

比如,列出班里所有同学的名字,就可以用一个list表示:

>>> classmates = ['Michael', 'Bob', 'Tracy']

>>> classmates

['Michael', 'Bob', 'Tracy']

变量classmates就是一个list。用len()函数可以获得list元素的个数:

>>> len(classmates)

3

用索引来访问list中每一个位置的元素,记得索引是从0开始的:

>>> classmates[0]

'Michael'

>>> classmates[1]

'Bob'

>>> classmates[2]

'Tracy'

>>> classmates[3]

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

IndexError: list index out of range

当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) – 1。

如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:

>>> classmates[-1]

'Tracy'

以此类推,可以获取倒数第2个、倒数第3个:

2、列表的相关操作

列表中存放的数据是可以进行修改的,比如”增”、”删”、”改””

<1>添加元素(“增”append, extend, insert)

append

通过append可以向列表添加元素

extend(+)

通过extend可以将另一个集合中的元素逐一添加到列表中

>>> a = [1, 2]

>>> b = [3, 4]

>>> a.append(b)

>>> a

[1, 2, [3, 4]]

>>> a.extend(b)

>>> a

[1, 2, [3, 4], 3, 4]

insert

insert(index, object) 在指定位置index前插入元素object

>>> a = [0, 1, 2]

>>> a.insert(1, 3)

>>> a

[0, 3, 1, 2]

 

<2>修改元素(“改”)

修改元素的时候,要通过下标来确定要修改的是哪个元素,然后才能进行修改

<3>查找元素(“查”in, not in, index, count)

所谓的查找,就是看看指定的元素是否存在

in, not in

python中查找的常用方法为:

in(存在),如果存在那么结果为true,否则为false

not in(不存在),如果不存在那么结果为true,否则false

#查找是否存在if findName in nameList:

print(‘在字典中找到了相同的名字’)

else:

print(‘没有找到’)

说明:

in的方法只要会用了,那么not in也是同样的用法,只不过not in判断的是不存在

index, count

index和count与字符串中的用法相同

>>> a = ['a', 'b', 'c', 'a', 'b']

>>> a.index('a', 1, 3) # 注意是左闭右开区间

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: 'a'isnotin list

>>> a.index('a', 1, 4)

3>>> a.count('b')

2>>> a.count('d')

0

<4>删除元素(“删”del, pop, remove)

类比现实生活中,如果某位同学调班了,那么就应该把这个条走后的学生的姓名删除掉;在开发中经常会用到删除这种功能。

列表元素的常用删除方法有:

del:根据下标进行删除,其实可以删除所有变量

pop:默认删除最后一个元素

remove:根据元素的值进行删除第一个

>>> l

['abcdef', ['aaa', 'bb', 'ccc'], 'ddd', 'fff']

>>> del  l[0]

>>> l

[['aaa', 'bb', 'ccc'], 'ddd', 'fff']

<5>排序(sort, reverse)

sort方法是将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小。

reverse方法是将list逆置。

>>> a = [1, 4, 2, 3]

>>> a

[1, 4, 2, 3]

>>> a.reverse()

>>> a

[3, 2, 4, 1]

>>> a.sort()

>>> a

[1, 2, 3, 4]

>>> a.sort(reverse=True)

>>> a

[4, 3, 2, 1]

<6>enumerate()

>>> chars = ['a', 'b', 'c', 'd']

>>> for i, chr in enumerate(chars):

...     print i, chr

...

0 a

1 b

2 c

3 d

 

3、元组

Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。

>>> aTuple = ('et',77,99.9)

>>> aTuple ('et',77,99.9)

如果要定义一个空的tuple,可以写成():

>>> t = ()

>>> t ()

但是,要定义一个只有1个元素的tuple,如果你这么定义:

>>> t = (1)

>>> t 1

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

>>> t = (1,)

>>> t (1,)

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。

最后来看一个“可变的”tuple:

>>> t = ('a', 'b', ['A', 'B'])

>>> t[2][0] = 'X'

>>> t[2][1] = 'Y'

>>> t ('a', 'b', ['X', 'Y'])

这个tuple定义的时候有3个元素,分别是’a’,’b’和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?

别急,我们先看看定义的时候tuple包含的3个元素:

当我们把list的元素’A’和’B’修改为’X’和’Y’后,tuple变为:

表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向’a’,就不能改成指向’b’,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!

理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

<1>访问元组

<2>修改元组

说明: python中不允许修改元组的数据,包括不能删除其中的元素。

<3>元组的内置函数count, index

index和count与字符串和列表中的用法相同

>>> a = ('a', 'b', 'c', 'a', 'b')

>>> a.index('a', 1, 3) # 注意是左闭右开区间
Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: tuple.index(x): x notin tuple

>>> a.index('a', 1, 4)

 3

>>> a.count('b')

 2

>>> a.count('d')

0

4、字典

1、字典的介绍

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

names = ['Michael', 'Bob', 'Tracy']

scores = [95, 75, 85]

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。

如果用dict实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用Python写一个dict如下:

>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}

>>> d['Michael']

95

软件开发中的字典

变量info为字典类型:

    info = {'name':'班长', 'id':100, 'sex':'f', 'address':'地球亚洲中国北京'}

说明:

l 字典和列表一样,也能够存储多个数据

l 列表中找某个元素时,是根据下标进行的

l 字典中找某个元素时,是根据’名字’(就是冒号:前面的那个值,例如上面代码中的’name’、’id’、’sex’)

l 字典的每个元素由2部分组成,键:值。例如 ‘name’:’班长’ ,’name’为键,’班长’为值

若访问不存在的键,则会报错:

>>> info['age']

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

KeyError: 'age'

在我们不确定字典中是否存在某个键而又想获取其值时,可以使用get方法,还可以设置默认值:

>>> age = info.get('age')

>>> age #'age'键不存在,所以age为None>>> type(age)

<type 'NoneType'>

>>> age = info.get('age', 18) # 若info中不存在'age'这个键,就返回默认值18

>>> age

18

2、字典的常见操作

<1>修改元素

字典的每个元素中的数据是可以修改的,只要通过key找到,即可修改

demo:

info = {'name':'班长', 'id':100, 'sex':'f', 'address':'地球亚洲中国北京'}

newId = input('请输入新的学号')

info['id'] = int(newId)

print('修改之后的id为%d:'%info['id']

<2>添加元素

demo:访问不存在的元素

info = {'name':'班长', 'sex':'f', 'address':'地球亚洲中国北京'}

print('id为:%d'%info['id'])

结果:

如果在使用 变量名[‘键’] = 数据 时,这个“键”在字典中,不存在,那么就会新增这个元素

demo:添加新的元素

info = {'name':'班长', 'sex':'f', 'address':'地球亚洲中国北京'}

# print('id为:%d'%info['id'])#程序会终端运行,因为访问了不存在的键

newId = input('请输入新的学号')

info['id'] = newId

print('添加之后的id为:%d'%info['id'])

结果:

请输入新的学号188

添加之后的id为: 188

<3>删除元素

对字典进行删除操作,有一下几种:

del

clear()

demo:del删除指定的元素

info = {'name':'班长', 'sex':'f', 'address':'地球亚洲中国北京'}

print('删除前,%s'%info['name'])

del info['name']

print('删除后,%s'%info['name'])

demo:del删除整个字典

info = {'name':'monitor', 'sex':'f', 'address':'China'}

print('删除前,%s'%info)

del info

print('删除后,%s'%info)

demo:clear清空整个字典

3、字典的常见函数:

<1>len()

测量字典中,键值对的个数

<2>keys == map.keySet()

返回一个包含字典所有KEY的列表

<3>values

返回一个包含字典所有value的列表

<4>items

返回一个包含所有(键,值)元祖的列表

<5>has_key (python2.7版本) == in 条件表达式

dict.has_key(key)如果key在字典中,返回True,否则返回False

4、字典遍历

<1> 遍历字典的key(键)

<2> 遍历字典的value(值)

<3> 遍历字典的项(元素)

<4> 遍历字典的key-value(键值对)

6、总结:

1、请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

2、和list比较,dict有以下几个特点:

1)查找和插入的速度极快,不会随着key的增加而变慢;

2)需要占用大量的内存,内存浪费多。

3)而list相反:查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

3、dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key

5、可变类型与不可变类型

上面我们讲了,str是不变对象,而list是可变对象。

对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

>>> a = ['c', 'b', 'a']

>>> a.sort()

>>> a ['a', 'b', 'c']

而对于不可变对象,比如str,对str进行操作呢:

>>> a = 'abc'

>>> a.replace('a', 'A') 'Abc'

>>> a 'abc'

虽然字符串有个replace()方法,也确实变出了’Abc’,但变量a最后仍是’abc’,应该怎么理解呢?

我们先把代码改成下面这样:

>>> a = 'abc'

>>> b = a.replace('a', 'A')

>>> b 'Abc'>>> a 'abc'

要始终牢记的是,a是变量,而’abc’才是字符串对象!有些时候,我们经常说,对象a的内容是’abc’,但其实是指,a本身是一个变量,它指向的对象的内容才是’abc’:

当我们调用a.replace(‘a’, ‘A’)时,实际上调用方法replace是作用在字符串对象’abc’上的,而这个方法虽然名字叫replace,但却没有改变字符串’abc’的内容。相反,replace方法创建了一个新字符串’Abc’并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符串’abc’,但变量b却指向新字符串’Abc’了:

所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。

总结:

1、可变类型,值可以改变:

列表 list

字典 dict

set (没有value的字典)

2、不可变类型,值不可以改变:

数值类型 int, long, bool, float

字符串 str

元组 tuple

本文来自投稿,不代表程序员编程网立场,如若转载,请注明出处:http://www.cxybcw.com/177435.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code