初探python(1)基础知识

人生苦短,我用Python

Python是一种怎么样的语言?

Python诞生

Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。

龟叔给Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。

龟叔

它常被成为胶水语言。能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写。

Python具有丰富和强大的库。提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作内置电池(batteries included)。除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。

Python适合开发的应用

  • 网络应用,包括网站、后台服务等等;

  • 许多日常需要的小工具,包括系统管理员需要的脚本任务等等;

  • 把其他语言开发的程序再包装起来,方便使用。

### Python的缺点

其一,便是运行速度慢。因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。

其二,代码不能加密。凡是编译型的语言,发布的是编译后的机器码如.exe,而解释型的语言,则必须把源码发布出去。

侧重点杂记

请务必注意,Python程序是大小写敏感的并且对于缩进要求严格,如果写错了大小写,程序会报错。如果直接复制粘贴,会导致缩进存在问题。

# -*- coding=utf-8 -*- 用以开头声明编码方式,输出中文

#用来注释,其他每一行都是一个语句,当语句以冒号“:”结尾时,缩进的语句视为代码块。

在讲Python之前,先讲一下一些Sublime的用法。

Sublime基础用法

Sublime作为我最常用的编辑器,不得不提一下其对于Python编程的一些快捷键。

1
2
3
4
5
6
7
8
9
ctrl+b //运行python程序

ctrl+c //停止运行

ctrl+/ //全体注释/取消注释

ctrl+[ //全体不缩进

alt+num //切换标签页

输入与输出

输入是Input,输出是Output,因此,我们把输入输出统称为Input/Output,或者简写为IO。

raw_input()print是在命令行下面最基本的输入和输出。

raw_input()调用时可填入空内显示一个字符串,用来做提示信息。

数据类型

Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”。

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

转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\。Python还允许用r''表示’’内部的字符串默认不转义

Python允许用'''的格式表示多行内容

空值是Python里一个特殊的值,用None表示。与0不同。

Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。

整数:一般意义上的数,包含十进制(无前缀),八进制(0开头),十六进制(0x开头),二进制(0b开头)

长整数:无限大小的数,表示范围和内存有关

浮点数:小数或用e/E(10的幂)表示的幂,默认,浮点数学缺乏精确性,可以使用decimal

变量

变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。

1
a = 'ABC'

以上,Python解释器干了两件事情:

1.在内存中创建了一个’ABC’的字符串;

2.在内存中创建了一个名为a的变量,并把它指向’ABC’。

也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据。而之后执行

1
a='XYZ'

b的值不会受到影响。

常量

在Python中,通常用全部大写的变量名表示常量。一般不改变其值,不过硬要改变也可,只不过违背了命名规则。

题外话:字符编码

在讲字符串之前,先提一下字符串编码的问题。

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。

由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。

但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

当然世界上还有其他国家,这么多语言,各国有各国的标准,如果一个文本里出现多种语言的话,就会乱码。

Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode

新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间.

另外,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

搞清楚了ASCII、Unicode和UTF-8的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器。

当看到<meta charset="UTF-8" />的信息时,也就意味着该网页正是用的UTF-8编码。

字符串

因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码。Python提供了ord()和chr()函数,可以把字母和对应的数字相互转换。

Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u’…’表示。

在Python 3.x版本中,把’xxx’和u’xxx’统一成Unicode编码,即写不写前缀u都是一样的,而以字节形式表示的字符串则必须加上b前缀:b’xxx’。

在字符串前加r,例r’xxx’,表示不转义字符串。

把u’xxx’转换为UTF-8编码的’xxx’用encode('utf-8')方法。反之则用decode('utf-8')

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

1
2
3
4
#!/usr/bin/env python
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'zjbao123'

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

此外,任何模块代码的第一个字符串都被视为模块的文档注释。

使用author变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名。

字符串处理

PEP8即Python编码样式指南中,要求每行不能超过80个字符,但在长字符串中如何做到呢?

可以通过反斜杠、带逗号“,”的圆括号“()”、或者额外的加号“+”来完成换行。但对于多行字符串,这些解决方案都不够优雅。Python有个多行字符串记号,即三个引号,但这样无法换行后保持缩进。

还有一个方法,那就是不带逗号的圆括号。我不知道为什么这种方式能工作,但能用就行。

1
2
3
4
my_long_text = ("We are no longer the knights who say Ni! "        
"We are now the knights who say ekki-ekki-"
"ekki-p'tang-zoom-boing-z'nourrwringmm!")
print(my_long_text)

另外,python还提供了很多的字符串处理方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
全部大写:str.upper()
全部小写:str.lower()
大小写互换:str.swapcase()
首字母大写,其余小写:str.capitalize()
首字母大写:str.title()
获取固定长度,右对齐,左边不够用空格补齐:str.ljust(width)
获取固定长度,左对齐,右边不够用空格补齐:str.rjust(width)
获取固定长度,中间对齐,两边不够用空格补齐:str.center(width)
获取固定长度,右对齐,左边不足用0补齐:str.zfill(width)

搜索指定字符串,没有返回-1str.find('t')
指定起始位置搜索:str.find('t',start)
指定起始及结束位置搜索:str.find('t',start,end)
从右边开始查找:str.rfind('t')
搜索到多少个指定字符串:str.count('t')
上面所有方法都可用index代替,不同的是使用index查找不到会抛异常,而find返回-1

替换old为newstr.replace('old','new')
替换指定次数的old为newstr.replace('old','new',maxReplaceTimes)

去两边空格:str.strip()
去左空格:str.lstrip()
去右空格:str.rstrip()
去两边字符串:str.strip('d'),相应的也有lstrip,rstrip

分隔:split()

是否以start开头:str.startswith('start')
是否以end结尾:str.endswith('end')
是否全为字母或数字:str.isalnum()
是否全字母:str.isalpha()
是否全数字:str.isdigit()
是否全小写:str.islower()
是否全大写:str.isupper()

格式化

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

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

格式 描述
%% 百分号标记 #就是输出一个%
%c 字符及其ASCII码
%s 字符串
%d 有符号整数(十进制)
%u 无符号整数(十进制)
%o 无符号整数(八进制)
%x 无符号整数(十六进制)
%X 无符号整数(十六进制大写字符)
%e 浮点数字(科学计数法)
%E 浮点数字(科学计数法,用E代替e)
%f 浮点数字(用小数点符号)
%g 浮点数字(根据值的大小采用%e或%f)
%G 浮点数字(类似于%g)
%p 指针(用十六进制打印值的内存地址)
%n 存储输出字符的数量放进参数列表的下一个变量中
%r 自加引号的字符串,再现他所代表的任意对象

%为普通字符需要用%%转义。
举个例子:

1
2
3
4
5
6
'%2d-%02d"%(3.14,6)
' 3-06'
"%9.2f"%12.345
12.35
"%09.2f"%12.345
000012.35

可以在”%”和字母之间插进数字表示最大场宽。
例如: %3d 表示输出3位整型数, 不够3位右对齐。
表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,
小数点占一位, 不够9位右对齐。
%09.2f其中小数位为2, 整数位为6,小数点占一位, 不够9位零补齐。

循环

循环for语言有所不同,其他略有改动,条件不用加括号,并且每条判断要加,之后的语句需要有缩进。

1
2
3
4
5
if else elif 
for..in 依次把列表内每个元素列出来
range(i) 0 到 i-1 的整数
while
ctrl+c 可退出循环

list

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

list是一种有序的集合,可以随时添加(insert(i,“hello”))和删除(pop(i))其中的元素。

如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素。以此类推,可以有-2,-3

1
2
for index, item in enumerate(mylist):
print(index, item)

列表推导

[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

tuple

另一种有序列表叫元组: tuple,用()表示。一旦初始化后不可修改,安全性好。

另外,有两个特例需注意。空的元组定义为(),单个元素的元组(i,)(与(i)数学意义相区别)

嵌套list可变为可变的元组。那要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。

list和tuple是Python内置的有序集合,一个可变,一个不可变。根据需要来选择使用它们。

字典

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

一对一存储,后来的值会冲掉之前的值。

如果字典里没有这个值,则会报错。那么事先可通过 in 来查找 或 get(”hello”,-1)不存在返回-1。

pop(key) 删除,对应value也会删除

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。

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

用键访问值的一种写法:

1
{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}["0"]

字典推导

字典推导尤其是在交换键和值十分管用。

1
2
3
4
5
my_phrase = ["No", "one", "expects", "the", "Spanish", "Inquisition"]
my_dict = {key: value for value, key in enumerate(my_phrase)}
print(my_dict)
reversed_dict = {value: key for key, value in my_dict.items()}
print(reversed_dict)

set

set是无序和无重复的交集,用([ ])表示。set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

通过add(key),remove(key)方法可以增删key。

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作。

set和dict的唯一区别仅在于没有存储对应的value。

再议不可变对象

str是不变对象,而list是可变对象。

1
2
3
4
5
a='ABC'
a.replace('a', 'A')
//'Abc'
a
//'abc'

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

此python学习路径来源于廖雪峰的Python教程的一个学习内容的总结。以便于自己后的学习和整理。