python的定位非常明确,它是一种简单易用但又专业严谨的语言。或者说叫胶水语言。普通人也很容易入门。python可以把各个基本程序拼接在一起协同运作。任何一个人只要愿意学习,可以在几天的时间内学会python的基础部分。然后做很多很多事情,这种投入产出比是任何其他语言无法具备的。
打个比方 我们都知道c语言和c++ java这种语言比较常用,那么如果我们以造一辆车做比喻,c是从头开始造。先造发动机,再造挡风玻璃,车门,雨刮,轮胎。甚至连一颗螺丝钉都是完全为这辆车打造的。最后造出来的是一辆独一无二的车。这个开发周期可能要一到两年。
而如果使用python造一辆车,轮子不用自己造,有很多轮子别人已经帮你写好了。这些轮子可能是拿c语言写的。你只需要选一个适合你的。同理,底盘,挡风玻璃等都可以选别人造好的。
这样造车,周期会非常短。可能只需要一个星期就能跑起来。当然,这辆车肯定相对来说没有c语言造出来的车要好。毕竟人家是定制的。我这个是拼接的。但是如果不合适我可以把轮子直接换一个。非常灵活。
如果有人说,python开发的程序没有c开发的程序跑得快,执行效率低。我想说的是,很多python的模块就是拿c写的。打个比方,python做的事情就是指挥这些模块去做事。是个指挥者的角色。我们做的很多时候都是逻辑。而不是方法。
例如,一个数据来了 交给某个python模块,这个模块是拿c写的,然后返回给你结果,你再拿到这个结果给另一个模块处理。很少有纯python的程序。执行效率当然没有纯c写出来的程序高。但是也差不了多少。
python的程序分为
模块 语句 表达式 和对象
程序由模块组成
模块包含语句,条件,循环….等等
语句包含表达式
表达式创建和处理对象。
为什么使用内置对象呢,内置对象是程序自带的,本身就支持的东西。比方说数字,字符,列表等等。并且可以基于内建对象创建新对象。
那么内置对象有哪些呢?下面列出了常用的内置对象。
大部分都是我们熟悉的。接下来看第一个 数字。这个是我们生活中也会用到的。python中处理的每个东西都是对象。所以这些很关键。
python的安装就不去说了。windows版在官网上的都能找到。macos和linux都能在官网上找到。安装过程网上都有教程。
首先每个对象我都会用以下这张表来概述特点。这些特点需要牢记。数字类型的特点如下:
类型:就是对象的类型 在内置类型里列出了常用的类型。现在说明的是数字。
分类:或者说特征,数字类型的特点就是里面只能放数值。常见的数值有整数,浮点数和虚数等。
可变:对象一旦定义就是不可变的。比方说定义了a=999 那么除非重新再赋值a=666 不然是没办法改变其中的值的。这个可以跟下面要讲的字符串做对比。先这么记着。
●1234,-24,0,999999 这些都是整数。
●1.23,1.5666,3.1415926 4e210 这些都是浮点数。
●0o177,0x12a,ob1010101011 这些分别是八进制,十六进制和二进制数。
●3+4j,3.0+4j 这些都是复数
●set(‘test’),{1,2,3,4} 这些是集合
●decimal(‘1.0’),fraction(1,3) 小数和分数 右边那个是1313
●bool(x),true,false 布尔和常量 布尔值就像真,假这种。
表达式操作符
+(加),-(减),*(乘),/(除),**(乘方),>>移位
这里要说明一下移位。移位是指将数字往前或者往后移动一位。例如算ip地址的时候经常会记下面的一串数字
64 32 16 8 4 2 1
那么例如8往后移动2位应该是2
下面来实际操作一下
内建数学函数可以理解为python自带的数学函数
例如
pow()乘方,abs()求绝对值,round()四舍五入,int, hex,oct,bin等等
之前也有说过python有很多别人写好的模块。这里直接导入别人写好的模块 随机数模块random。
然后我们来看看用随机数模块如何快速生成随机数。这个如果有学过c语言应该知道 让计算机生成随机数可以调用rand()函数,但是每次生成的序列是一样的。而且还要有种子值之类的。写起来还比较麻烦。
其中用[]框起来的是列表 后面我们会提到。总之python实现排序是如此简单,别人已经跟你写好了。你只需要告诉他需要干嘛就行了。非常好用。不需要了解实现方法。python有很多很多模块,都是已经写好了的。你只需要关心 把什么东西传进去,把得到的东西再给什么模块处理就行了,不需要关心他到底是怎么找的。这就是python在写起来很快的原因。当然,前提条件是你要知道有这么个东西。比方说数学模块其实有很多东西的。
前提是你要很懂数学 才能很好的去利用这些工具和模块。
字符串的特点如下:
字符串应该是用的比较多的。待会儿解释一下什么叫序列类型。以及不可变是什么概念。
字符串是可以单引号,双引号和三引号框起来。反过来说,用这些符号框起来的就代表里面的是字符串。先体验一下吧。
那么除了我们常用的英文字母,数字,中文等字符串,还有一些特殊的东西我们要了解。
我们都知道单引号有特殊的意义 用于把字符串引起来,但是如果我想要输出正常的单引号又该怎么办呢?这个时候就需要使用转意符号,告诉程序这里的单引号没有特殊意义。就是一个普通的字符。
如果这么去做会直接报错。那么现在在python和cisco之间的单引号前面加一个转意符号\。
除了上述这种情况,其实很多时候我们会碰到\t \r\n这种特殊符号。这个\t代表一个tab \r代表回车\n代表换行。
你会发现中间空了一块出来,这就是制表符(table)的效果。
\n就是回车。
\r为换行。
在计算机还没有出现之前,有一种叫做电传打字机(teletype model 33)的机械打字机,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界,不卷动滚筒;另一个叫做“换行”,告诉打字机把滚筒卷一格,不改变水平位置。
这就是“换行”和“回车”的由来。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成cr,即carriage return。
换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成lf,即line feed。
\n 10 换行nl
\r 13 回车cr
在不同的操作系统这几个字符表现不同,比如在win系统下,这两个字符就是表现的本义,在unix类系统,换行\n就表现为光标下一行并回到行首,在mac上,\r就表现为回到本行开头并往下一行,至于enter键的定义是与操作系统有关的。通常用的enter是两个加起来。
不同操作系统下的含义:
\n: unix 系统行末结束符
\r\n: window 系统行末结束符
\r: mac os 系统行末结束符
如果我们想输出一个windows里的路径例如
d:\world of warcraft\test\wow64.exe
这里面会有多个斜杠。
你会发现这边\test由于出现了\t,程序会认为这是一个制表符。我们也不能保证windows里的路径一定不出现这种特殊的东西。有两种办法解决。第一种是在每个斜杠前面加上\转意,来表示后面的斜杠没有特殊意义。这样比较麻烦。另一种办法就是使用r 原始字符串,代表后面的所有内容均是普通字符串,没有任何其他意义。
之前提到了字符串是一种有序的类型,什么叫有序呢?就是字符串里的每个字符都有对应的位置。可以通过索引的办法提取出来。
计算机数数都是从0开始的。所以playstation4对应的位置就是:
刚才提到了序列,接下来谈谈可变。字符串的类型是不可变,也就是说你不能更改字符串里的某一个字的值。要想更改,只能重新整个赋值。
这边报错了 。代表字符串确实是不可变的,后面在讲列表的时候这种操作就是可以被执行的。
python的多态说法非常多。这边直接拿实际操作举例吧!
上面代码的意思是 打印- 后面*10代表 -乘10。
如果是c语言这种 直接拿字符串乘一个数字是肯定会报错的。但是python这种语言的多态特性就可以做到这种事情。
只要是序列类型 都可以用for循环进行迭代处理。
第一次循环会迭代str里的第一个值c 然后打印出来 回车,第二次会迭代第二个值 i 打印出来 然后回车。以此类推。 每次循环迭代出的内容就会赋值给x。for循环可以对序列类型对象进行迭代。把每次迭代的结果进行输出。如果输出的时候不想要自动换行。可以这样。
其中end=’’代表每次迭代以空为结束。
所有的序列类型都可以索引和切片
拿字符串playstation4来说。
这是提取string字符串中3号位置的示例。
[3]代表3号位置 这种方式叫索引。
也可以倒过来提取。
除了索引,我们还可以进行切片:
对比上面的位置 我们会发现处于7号位置的’t’并没有出现。1号位的’l’出现了。
这种切片方式,左边的叫下边缘,右边的叫上边缘。默认上边缘是不要的。也就是输出了不包含上边缘
其他的切片方式如下:
例如我们想把字符串拼一起
字符串之间的拼接是没问题的。
如果再来一个4呢?
你会发现报错 并且提示字符串不能和数字相加。这个时候需要做转换:
str(4)代表将括号里的内容转换成字符串。这样就可以拼接了。
在输出字符串的时候我们希望能够把字符串做格式化,显示出来干净整齐,格式统一。这就是字符串格式表达式的目的。
字符串格式化有两种方法。第一种是传统表达式方法,第二种是新方法。来体验一下。
string formatting expressions:
‘…%s…’(values)
%左边是一个格式化的字符串,包含一个或多个嵌套的转换目标,每个目标用%开始。
%右边提供一个或者多个对象(多个对象需要放在元组中),这些对象用来替换%左边的转换对象
能够看到。整个语句用%分隔开,分成左边和右边。左边是已经格式化了的字符串,右边是用来替换%d和%s的内容。
其中%d这个地方要替换的是整数
%s代表这个地方要替换的是字符串。
要替换的值放在元组里,元组在后面会介绍。其实就是用小括号括起来的东西。
%d—-整数
%s—-字符串
%f—-浮点
%[(keyname)][flags][width[.precision]typecode
keyname代表%后面其实还可以放一个字典的键值,由于字典还没有涉及到,这边先放着;
flags可以指明字符串是左对齐(-)还是右对齐还是用0补齐,默认右对齐。
width代表整体宽度;
如果是小数还可以用,后面跟数字来表示小数点位数 例如.2f表示保留小数点后2位的浮点。
第一个%d代表直接输出
第二个%-10d代表左对齐输出,宽度10
第三个%10d代表右对齐输出,宽度10
%010d代表右对齐输出,宽度10,不足的位置用0补齐
得出的结果就如上所示了。
接下来看看关于浮点数的输出
第一个%f啥也不做
第二个%.2f代表保留小数点后2位
第三个%010.3f代表右对齐,长度10位,不够的用0补齐
第四个%5.2f代表右对齐,保留小数点后2位并且占5位长度
string formatting method calls:’…{}…’.format(values)
刚才讲的是传统的方法。现在来看一下新方法。
{fieldname component !conversionflag :formatspec}
filename是指定参数的关键字或数字,后面跟可选的’.name’(属性)或者’[index]’(键值)成分引用
conversionflag可以是r,s或者a分别是该值上对repr,str,ascii内置函数的一次调用
formatspec指定如何表示该值,包括宽度,对齐方式,补零,小数点精确度等。
这是基于位置的方法,意思是0号位置是playstation,1号位置是nintendo,2号位置是microsoft。还有基于名字的。
这就相当于有playstation位,switch位和xboxone位。
当然 这两种方法可以混合起来用。
刚才提到了老方法可以控制宽度,小数点位数等。�...