Home

ywainxiao

enjoy code; enjoy life.

Blog About Github Contact

2018-12-10
Python专场:Python入门(一)

Table of Contents

写在前面的话

这篇文章首先花很多文笔介绍我总结出的四个编程入门的基本核心概念,接着分两章详细介绍了 Python 的里面的六大数据类型中的两个:数字和字符串。

基本核心概念

很多情况下,代码都可以看成是由两部分组成,一部分是数据类型(可以称之为对象),另一部分就是对这些数据类型的操作(可以称之为方法)。从这个角度上看,写代码其实是围绕着写数据类型展开的,所以熟练掌握各种数据类型是写代码的基本功。但在学具体的数据类型之前,我先来普及一下写代码必不可少的内功:变量、赋值、内存、对象四个概念。这说起来有四个名词,但其实他们是紧密联系在一起的。其中内存和对象的概念不那么容易理解,初学者掌握变量和赋值的概念就可以,随着写代码的经验增多,理解对象和内存是水到渠成的事情。

变量和赋值

变量是你自己命名的标识符,你可以用=号给它赋值,赋值了就代表这个标识符它有了值(即数据),它的值就是你赋的值,在 Python 里边,只有变量赋值了,这个变量才被创建,才能被使用;你可以把变量理解为一个容器,把赋值理解为往容器里面倒东西,变量这个容器里面可以装任何你想要装进去的数据,也可以倒出原来装的数据,装其他的数据。举个例子,你先给变量 a 赋值 1,再给 a 赋值 2,输出 a,结果就是 2 而不是 1;你也可以再给 a 赋值另一种类型的数据,比如字符串 ‘abc’,运行后 a 的值又变成了 ‘abc’。从这里可以知道,在 Python 里面的变量本身是没有类型之分的,只有变量里面装的数据才分类型。

这里注意 “=” 不是指数学上的判断是否相等的符号,在代码王国的游戏规则里,“=” 指的是赋值,“=” 左边是变量,右边是要赋给变量的值。( “==” 才是数学意义上的判断两边是否相当的符号)

代码0:

内存和对象

内存指的是一个数据类型一定会在电脑里边占据一定的内存空间,这里就包含了两重信息,一个是占了多大的内存空间,另一个是占据的是哪个位置的内存空间(我们管这个叫地址)。要注意的是,我们常说的内存不是指变量的内存,而是数据类型的内存。姑且可以这么理解,变量本身是不占据内存的,只有被装在变量里边的数据类型才会占据内存,可以结合下面对象的概念来理解这一点。

个人认为对象是 Python 语言里面最重要的概念之一,在 Python 里面有这么一句话:一切皆是对象。这句话含义非常丰富,这里我只介绍一点,就是所有你用到的数据类型都是一个个的对象,而所谓的变量只是装这些对象的容器(用术语说就是,某个变量指向某个对象)。在写代码的时候,我们真正操作的、使用的都是对象,而不是变量(虽然大多数情况下我们使用的好像是变量,但那只是表象)。这就好像是你去商场购物,大多数情况下你看到的是商品的包装(变量),但你真正想要的、要用的其实是商品本身(对象)。我发现,每当对一个变量进行操作的时候,思考一下这个问题往往很有帮助:这个操作带来的结果是返回一个新的对象呢,还是确实改变了原来变量所指向的那个对象?

数字 Number

数字分类

Python 里面的数字分类有很多,常见的种类有三种:整数(int)、浮点数(float)、复数(complex),其中整数、复数和数学中的概念一样,浮点数复杂一点,暂时可以理解为数学里面的小数。其中 int 型里面还包含一种子类型,叫做 bool 型,这个类型只有两个数,一个是 True ,值为 1,代表“有”这个概念,它可以是任何非零数字。另一个是 False,值为 0,代表“无”这个概念,它可以是数字 0,也可以是空,Python 里面用 None 表示空,也就是无。 bool 型变量看起来很简单,但其实很深奥(想想道德经,你就知道能有多深奥了),而且它用处特别大,可以说 bool 变量用的好不好,能体现一个人编程水平的高低。

特殊运算符

Python 除了有 『+ - * /』 这些一般的运算操作符以外,还有一些比较特殊的,和其他语言不太一样的操作符,比如说 // 表示整除,% 表示取余,** 表示乘方。
这里总结一下,现在我们学了三个双符号,== 表示判断是否相等,// 表示整除,** 表示乘方。

字符串 String

字符串的表示

字符串说白了就是一串的字母、数字或者符号,这看起来很简单,但其实字符串的表示、处理操作在任何一种语言里面都可以说是非常麻烦,而且是必须要掌握的。首先来讲字符串的表示方法,Python 用单引号或者双引号把一串字符包起来,就表示这里面是一个字符串类型的数据,不是其他什么。比如说这句语句:我们创建一个变量 str ,给它赋值一个字符串,并且输出这个字符串。
代码一:

特殊字符以及表示方法

现在我们可以表示除了引号以外的所有字符了,但怎么表示引号呢?也就是说,如果引号本身也是字符串的一部分,那该怎么办?别急,Python 里面同样有解决方案,用反斜杠 \,反斜杠你可以理解为一层隐身衣,它可以帮助引号逃过系统的“检查”,这样系统就认为,这就是一个和其他字符一样的普通的字符,所以就把它也按其他字符一样表示出来。事实上反斜杠能够帮很多其他有特定功能的字符逃过系统的检查,所以它被称为转义字符(我更喜欢叫他隐身衣)。讲到这里,有悟性的人应该又会想到,那如果反斜杠本身也是字符串的一部分,我们又该怎么办?答案也很简单,反斜杠这件隐身衣也可以穿在自己身上,也就是说在反斜杠前面再加一个反斜杠就可以表示后面那个反斜杠。你可以简单记成两个反斜杠表示一个反斜杠,但你心里得清楚,前一个是隐身衣,个后面那个才是你想要表示的反斜杠。
其实不止反斜杠是特殊字符,在 Python 里面,和反斜杠搭配起来的几乎都是特殊字符,这里介绍常用的两个:『\n \t』,\n 表示换行符(可以理解为回车键),\t 表示制表符(可以理解为 tab 键)。虽然掌握用转义字符 \ 给一些特殊字符穿上隐身衣的方式特别有用,但是在很多情况下会显得比较繁琐,下面介绍两个跳过转义字符的常用的技巧:

1.在双引号字符串里面表示单引号 或者 在单引号字符串里面表示双引号 的情况下,可以省略反斜杠。这个很好理解,因为反斜杠真正用意在于消除不确定性,而前面两种情况,我们已经能够很容易区分哪种类型的引号是用来表示字符串的引号(特殊功能符号),哪种类型的引号是字符串里面的一部分(普通符号),所以就没必要使用反斜杠了。
2.用 r 标识在字符串的前面,r 是英文单词 “row” 的简称,意思是原材料,我把它理解为原汁原味的字符串。在一串字符串前面加上字母 r,系统就会知道,里面的就是单纯的字符串,不存在任何有特殊功能的字符。你可以把 r 理解为通关文牒,加上 r,系统就不一个个搜查字符串里面的字符,而是直接一下子全部放过去,这种情况下当然就没必要穿上隐身衣了。

代码二:

字符串的格式化输出

我们表示出字符串之后,怎么知道它确实是我们想要表示的那样呢?这个就需要计算机把字符串输出来,出于审美的需求,我们希望输出的字符串能够按照我们想要的格式输出,所以就叫做格式化输出。字符串的格式化输出有两个方法:

1.使用 print 函数格式化输出,格式是 (string % values),其中 string 指字符串,% 是专门的格式化操作符号,values 指的是值,这个值只能是 Python 六大数据类型中的两个(元祖和字典),暂时我们只要记住值有特定的表示方法就行。
这里的 %s、%d、%f 表示指定后面的值的数据类型,s 表示 string,f 表示 float,d 表示十进制(decimal)的整数,在 d 前面加上 “0+n” 表示在整数前面添 0,让这个整数的长度是 n;在 f 前面加上“.n”表示浮点数小数点后保留 n 位小数,你可以看到这里我们完美的把字符串 string 和前面讲到的数字 number 结合起来了。
2.使用 format 函数,他的功能更加强大,我会在后面给大家详细介绍它的使用方法。

代码三:

字符串的拼接

字符串的拼接在 Python 里面有很多种方式,这里只介绍最简单的两种,

1.字符串对象之间直接拼接:Python 会自动把挨在一起的字符串拼接起来,组成一个新的字符串。
2.使用运算符号 +,也可以把两个字符串拼接起来。这里你可能会犯嘀咕,Python 不是以简洁著称吗?本来不用 + 也可以为什么还要多此一举?这里就要联系我们一开始学的变量的概念,前面说过,写代码的时候我们大多数时候使用的是变量,而对变量进行操作,用第一种方法显然不现实。举个例子,str1 = 'hello ', str2 = 'world!',你当然可以用 'hello ''world!' 来组成经典语句 'hello world',但我们一般使用 str1 + str2 (或者 str1 + 'world!') 来连接成 'hello world!',而使用 str1str2 或者 str1'world!' 是没办法让系统理解你的意思的。

代码四:

字符串的提取

字符串本质上是一些字符的有序队列,所以我们可以用编号来取出其中任何一个或者几个字符。比如说我们定义一个 str 的字符串变量,我们可以通过下面的操作来读取里面第 1 个字符,第 1 到第 3 个字符,和第 3 到最后所有字符。这里要牢牢记住两点,一是 Python 里面所有有序队列的标号是从 0 开始的,也就是说编号为 0 代表排在第一位,编号为 1 代表排在第二位;二是 Python 所有区间操作都是左闭右开,也就是 [0:4] 表示取编号为 0 到标号为 3 的所有字符,但是不取编号为 4 的字符。
代码五

字符串的处理方法

因为我们对字符串的操作需求有很多,比如说删掉字符串里面一些特定的字符,转换字符的大小写等等。为了满足这些需求,我们相应地需要有更加复杂的功能。这里引入一个新的概念:函数,函数的英文叫做 function ,翻译过来其实是功能、方法。 之前在格式化输出一节,我们讲的 print、format 其实也就是函数。函数本质上是把一系列常用的基本操作组合起来,实现一些经常要用到的复杂的功能。函数是编程的核心概念之一,这里只是简单讲一下,我会在后面花时间仔细讲。

下面列举三个对字符串进行操作的函数:len、title、strip。
len:用来返回字符串的长度,就是这个字符串里面有多少个字符。
title:将字符串转换为标题型,就是将字符串里面每一个单词的首字母改成大写字母。
strip:删除掉字符串里面你想删掉的字符,函数括号里的字符串里面的字符就是你选择要删掉的字符,如果括号里面没有字符,就默认删掉字符串里面所有的空格。

代码6

虚实之分:变量与对象

前面在「基本核心概念」里面说到,每当对一个变量进行操作的时候,思考一下这个问题往往很有帮助:这个操作带来的结果是返回一个新的对象呢,还是确实改变了原来变量所指向的那个对象?
从下面这几句代码可以很容易地理解到,str.title() 并没有真正改变 str 这个变量指向的对象,而是返回了一个新的对象,这个对象就是将 str 指向的字符串处理后返回的新的对象。那怎么区分这个操作是返回一个新的对象,还是确实改变了原来变量所指向的那个对象?有两个方法,一个是查阅官方文档,一个是区分可变对象和不可变对象,这个会在后面几期陆续介绍。
代码7

PS如果觉得好,不要忘记返回公众号小手点赞,支持一下。


欢迎关注我的微信公众号:大学启示录

二维码


上一篇:初识Python
下一篇:Python 入门(二)


Blog About Github Contact