Hello world!
算法是流程或菜谱的时髦说法,详尽描述了如何完成某项任务。
数和表达式 除法运算的结果为小数,即浮点数。 整除运算,使用双斜杠。 求余运算符%。x%y = x - ((x//y)*y)【结果向下圆整】,应用“每10分钟检查一次”之类的操作。 乘方(求幂)运算符**,乘方运算符的优先级比求负高,-3**2等价于-(3**2)。 十六进制0x,八进制0o,二进制0b1011010010
变量(variable)是表示(或指向)特定值的名称。例如,可以使用名称x来表示3,为此执行如下代码: >>> x = 3 这称为赋值(assignment),将值3赋给了变量x。给变量赋值后,就可在表达式中使用它。 >>> x * 2 6 在Python中,名称(标识符)只能由字母、数字和下划线( _ )构成,且不能以数字打头。因此Plan9是合法的变量名,而9Plan不是。标识符命名规则基于Unicode标准。
语句 表达式是一些东西,而语句做一些事情。 例如,表达式2*2的结果是4,而语句print(2*2)打印4。 注,print实际是一个函数,前面说的print语句其实是函数调用。
赋值语句不是表达式,它们没有可供交互式解释器打印的值。 >>> x = 3 >>>
模块 可将模块视为扩展,通过将其导入可以扩展Python功能。导入模块,使用特殊命令import。
nan指“非数值”(not a number)。
神奇模块 _future_
井号 # 是注释,在代码中,井号后面到行尾的所有内容都将被忽略。
字符串 代码print("Hello, world!")中"Hello, world!"就是字符串(string)。字符串主要用来表示一段文本。
与数一样,字符串也是值。
Python中单引号和双引号没有差别,只用来区分字符串中的单引号(或称标点)。 反斜杠( \ )可以对引号进行转义,如下所示: >>> ‘Let\'s go!' "Let's go!" 后面会讲,在大多数情况下,可通过使用长字符串和原始字符串(两种结合)来避免使用反斜杠。
拼接字符串 用 +
字符串表示str和repr(像int一样,str也是一个类,但repr是一个函数) 换行符编码\n 使用str能以合理的方式将值转换为用户能够看懂的字符串。
在Python3中,所有的字符串都是Unicode字符串。
长字符串,跨越多行的字符串,可使用三引号,或三个双引号。
原始字符串用前缀r表示。原始字符串不能以单个反斜杠结尾。
Unicode、bytes和bytearray Python字符串使用Unicode编码来表示文本。
数据结构是以某种方式(如编号)组合起来的数据元素(如数、字符乃至其他数据结构)集合。在Python中,最基本的数据结构为序列(sequence)。
Python中内置多种序列,常用的两种:列表和元组。字符串也是一种重要序列。 列表和元组的不同在于,列表是可以修改的,元组不可以。 在数据库中,可以使用序列来表示人,其中第一个元素为姓名,第二个元素为年龄。如果使用列表来表示,所有元素都放在方括号内,用逗号隔开。
Python支持一种数据结构的基本概念,名为容器(container)。两种主要的容器是序列和映射(如字典)。在序列中,每个元素都有编号,在映射中,每个元素都有名称(也叫键)。还有一种既不是序列也不是映射的容器,集合(set)。
序列操作: 索引 切片 相加 相乘 成员资格 迭代(iteration)
索引 indexing 序列中所有元素都有编号——从0开始递增。 使用负数索引时,Python将从右(即最后一个元素)开始往左数,因此-1是最后一个元素的位置。
切片 slicing 除使用索引来访问单个元素外,还可用切片访问特定范围内的元素。为此,可使用两个索引,并用冒号分隔。 举例:从URL中提取域名 url[11:-4],11是http://www.,-4是.com。
执行切片操作时,你显式或隐式地指定起点和终点,但通常省略另一个参数,即步长。在普通切片中,步长为1,这意味着该切片包含起点和重点之间的所有元素。举例: >>> numbers[0:10:1] [1,2,3,4,5,6,7,8,9,10] >>> numbers[0:10:2] [1,3,5,7,9] numbers[3:6:3] #注【3:6】指的是4,5,6 [4] 要从序列中每隔3个元素提取1个,那么选择步长为4。 步长不能为0,否则无法向前移动,但可以为负数,即从右向左提取元素(结果反着显示,例如-2步长【6,4,2】这样。
序列相加 >>> [ ] + ' '
乘法 当序列与数x相乘,将重复这个序列x次来创建一个新序列: >>> 'python' * 5 'pythonpythonpythonpythonpython' >>> [42] * 3 [42, 42, 42]
空列表是使用不包含任何内容的两个方括号([ ])表示的。 在Python中,None表示什么都没有。因此,要将列表的长度初始化为10,可如下: >>> sequence = [None] * 10 >>> sequence [None, None, None, None, None, None, None,.....None]
成员资格 要检查特定的值是否包含在序列中,可使用运算符in。in运算符检查是否满足条件,并返回相应的值:满足时返回True,不满足返回False。这样运算符称为布尔运算符,前述真值称为布尔值。
示例 >>> permissions = 'rw' >>> 'w' in permissions Ture
应用:授予访问权限 Access granted。
长度、最小值和最大值 内置函数len返回序列包含的元素个数、min返回序列最小的元素和max最大。 >>> numbers = [100, 34, 678] >>> len(numbers) 3
列表:Python的主力 列表不同于元组和字符串,列表是可变的,可以修改其内容。
使用字符串来创建列表(字符串不能修改),用函数list。list的参数可以是任何序列,下列以字符串为例: >>> list('Hello’) ['H', 'e', 'l', 'l', 'o']
修改列表:给元素赋值 不是使用x = 2这样的赋值语句,而是用索引表示法给特定位置的元素赋值,如x[1]=2。 >>> x = [1,1,1] >>> x[1] = 2 >>>x [1, 2, 1]
删除元素 del语句,>>> del names[2]
给切片赋值 不仅可以给每个元素赋值,也可改变切片长度,还可在不替换原有元素的情况下插入新元素。 >>> name = list('Perl') >>> name[1:] = list('ython') >>> name ['P', 'y', 't', 'h', 'o', 'n']
列表方法 方法是与对象(列表、数、字符串等)联系紧密的函数。通常,这样调用方法: object.method(arguments) 1. append,方法append用于将一个对象附加到列表末尾。 >>> lst = [1, 2, 3] >>> lst.append(4) >>> lst [1, 2, 3, 4]
给列表取名lst,而不是list的原因是,list是一个内置函数(类型),若将列表命名list,就无法调用这个函数。其他命名方法可参考,prices、prices_of_eggs或pricesOfEggs。
append修改列表,不会返回修改后的新列表,而是直接修改旧列表。
2. clear 方法clear就地清空列表内容。
3. copy
4. count 方法count计算指定的元素在列表出现了多少次。
5. extend 方法extend能够同时将多个值附加到列表末尾。 看起来类似于拼接,但extend是修改了被扩展的序列;常规拼接返回的是一个全新的序列。 另,拼接操作并非就地执行,它不会修改原来的列表。
6. index 方法index在列表中查找指定值第一次出现的索引。
7. insert
8. pop 方法pop从列表中删除一个元素(默认为最后一个元素),并返回这一元素。
pop是唯一既修改列表又返回一个非None值的列表方法。
使用pop可实现一种常见的数据结构——栈 stack。栈就像一叠盘子。最后加入的盘子先取走,后进先出 LIFO。
栈操作(加入和取走)。方法pop和append的效果相反,因此将刚弹出的值压入(或附加)后,得到的栈与原来相同。
9. remove 方法remove用于删除第一个为指定值的元素。
remove是就地修改且不返回值的方法之一。
10. reverse 按想法顺序排列列表中的元素。reverse修改列表但不返回任何值(与remove和sort等方法一样)。
reversed函数,按相反顺序迭代序列。这个函数不返回列表,而返回一个迭代器。可用list将返回的对象转换为列表。
11. sort 方法sort用于对列表就地排序。也就是对原来的列表进行修改,使其元素按顺序排列,而不是返回排序后的列表副本。
sort也是修改列表,但不返回任何值。比如你修改x列表为y,最终结果是对x排序,y为None。若要实现y,方法之一是先将y关联到x的副本,再对y排序。只是将x赋给y是不可行的,因为这样x和y将指向同一个列表。为获取排序后的列表的副本,另一种方式是使用函数sorted。
12. 高级排序 方法sort接受两个关键字参数:key和reverse。
参数key类似于参数cmp: >>> x.sort(key=len) 意思是按元素的长度进行排序。 reverse用法如下 >>> x.sort(reverse=Ture)
元组:不可修改的序列 元组语法简单,只要将一些值用逗号分隔,就自动创建一个元组。若只有一个值,也必须在它后面加上逗号。(没有逗号就不是元组!)
元组可以用圆括号括起,通常如此。
空元组用两个不包含任何内容的圆括号表示。
函数tuple的工作原理与list很像,它将一个序列作为参数,并将其转换为元组。如果参数已经是元组,就原封不动地返回它。
使用字符串
将值转换为字符串并设置其格式: 使用运算符% 在%左边指定一个字符串(格式字符串),在右边指定要设置其格式的值。这个值可使用单个值(如字符串或数字),可使用元组(如果要设置多个值的格式),还可使用字典。
格式字符串中的%s称为转换说明符,指出了要将值插入什么地方。s意味着将值视为字符串进行格式设置。
模版字符串:类似于UNIX shell的语法。 包含等号的参数称为关键字参数。 >>> from string import Template >>> tmpl = Template("Hello, $who! $what enough for ya?") >>> tmpl.substitute(who="Mars", what="Dusty") 'Hello, Mars! Dusty enough for ya?'
编写新代码时,应选择使用字符串方法format。用法:每个替换字段都用花括号括起。在最简单的情况下,替换字段没有名称或将索引用作名称。 >>>"{}, {} and {}".format("first", "second", "third") 'first, second and third'
格式说明符.2f,用冒号将其与字段名隔开(:.f),意味着使用包含2位小数的浮点数格式。
若变量与替换字段同名,可在字符串前面加上f。
略(更多设置字符串的格式)
字符串方法
关于模块string 虽然字符串方法完全盖住了模块string的风头,但这个模块包含一些字符串没有的常量和函数。下面就是模块string中几个很有用的常量。 口 string.digits: 包含数字0~9的字符串。 口 string.ascii_letters: 包含所有ASCII字母(大写和小写)的字符串。 口 string.ascii_1owercase:包含所有小写ASCII字母的字符串 口 string.printable: 包含所有可打印的ASCII字符的字符串。 口 string.punctuation:包含所有ASCII标点字符的字符串。 口 string.ascii_uppercase: 包含所有大写ASCII字母的字符串。
虽然说的是ASCII字符,但值实际上是未解码的Unicode字符串。
center 通过在两边添加填充字符(默认为空格)让字符居中。
find 在字符串中查找子串,如果找到,就返回子串的第一个字符的索引,否则返回-1。 注意:上述“子串第一个字符的索引”是数字。索引是字符串的位置+1。
还可指定搜索的起点和终点。('123',1 , 10)中,123是查找内容,起点值也即第二个参数为1。
join 用于合并序列的元素,与split相反。 所合并序列的元素必须都是字符串。 形式:sep.join(seq)
lower 返回字符串的小写版本。用法形式同上,title和capwords用法一样。 title,所有的首字母大写。输出结果例"That'S All, Folks" 模块string中的函数capwords。"That's All, Folks"
replace 将指定子串都替换为另一个字符串,并返回替换后的结果。#此功能相当于查找并替换 用法 'This is a test'.replace('is', 'eez')
split 将字符串拆分为序列。 若不指定分隔符,将默认在单个或多个连续的空白字符(空格、制表符、换行符等)处进行拆分。 >>> ' /usr/bin/env'.split('/') [' ', 'usr', 'bin', 'env']
strip 将字符串开头和末尾的空白(不含中间的空白)删除,并返回删除后的结果。 多用于将输入和存储的值进行比较,lower也是。
translate 与replace一样替换字符串的特定部分,不同的是,它只能单字符替换。 使用translate前必须创建一个转换表。该表指出了不同Unicode码点之间的转换关系。
判断字符串是否满足特定条件 比如是否都以is打头,包含的字符全为空白、数字或大写之类。若字符串具备特定的性质,这些方法就返回Ture,否则False。
字典
列表,将一系列值组合成数据结构并通过编号来访问各个值。 映射mapping,通过名称来访问各个值的数据结构。 字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。
字典,让你轻松找到特定的键,以获悉其值。
字典的表示方法 phonebook = { 'Alice': '2341', 'Beth': '9102', ……} 字典由键及其相应的值组成,这种键-值对称为项item。Alice为键,2341为值。写法注意三种符号,如上标黄所示。 空字典表示为{}。 字典中,键必须是独一无二的,值无需如此。
函数dict(不是函数,是类) 从其他映射(如其他字典)或键-值对序列创建字典。
字典与序列相似的基本操作: 口 len(d)返回字典d包含的项(键-值对)数。 口 d[k]返回与键k相关联的值。 口 d[k] = v将值v关联到键k。 口 del d[k]删除键为k的项。 口 k in d检查字典d是否包含键为k的项。
字典与列表的不同: 口 键的类型:字典中的键可以是任何不可变的类型 口 自动添加:字典中原本没有的键,也可给它赋值,这将在字典中创建一个新项。如果不使用append或其他类似方法,就不能给列表中没有的元素赋值。 口 成员资格:表达式k in d(d是一个字典)查找键而不是值,表达式v in l(l是一个列表)查找的是值而不是索引。
字符串格式设置功能用于字典 format_map
字典方法 chear:删除所有字典项,什么都不返回(或返回None)。此操作就地执行,如同list.sort。 copy:浅复制,值本身是原件而非副本;深复制。 fromkeys:创建一个新字典,其中包含指定的键,且每个键对应的值都是None。 get:查找。通常访问字典中没有的项将引发错误,使用get访问不存在的键,没有引发异常,返回None。还可指定默认返回值。 items:返回一个包含所有字典项的列表,其中每个元素都为(key, value)的形式,字典项在列表中的排序不确定。这个返回值属于字典视图,可用于迭代。 keys:返回一个字典视图,其中包含指定键。 pop:获取与指定键相关联的值,并将该键-值对从字典中删除。 popitem:删除并返回一个元素。此方法类似于list.pop,list.pop弹出列表中最后一个元素,而popitem随机弹出一个字典项,因为字典项的顺序是不确定的,没有”最后一个元素“的概念。 setdefault:获取与指定键相关联的值。在字典不包含指定的键时,添加指定的键-值对。 update:使用一个字典中的项来更新另一个字典。调用update时,可向它提供一个映射、一个由键-值对组成的序列(或其他可迭代对象)或关键字参数。 values:返回一个由字典中的值组成的字典视图。其返回的视图可能包含重复值。
语句的一些用法(打印语句、导入语句和赋值语句)
Python的两种编程模式: 脚本(Script Mode Programming)和交互式编程 (Interactive Mode Programming)。交互式Python会话中,分别执行每条语句并打印其内容。脚本,一次性运行整个程序。
print(现在是一个函数,但以前是一个语句) print用于打印一个表达式,这个表达式要么是字符串,要么将自动转换为字符串。
可以同时打印多个表达式,条件是用逗号分隔: >>> print('Age:', 42) Age: 42 它会在参数之间插入一个空格。 若字符串变量不包含逗号,而你需要逗号,解决方案是: print(变量 + ', ', 变量, 变量)
自定义分隔符,例分隔符是下划线>>> print("变量“,……, sep="_") 可以自定义结束字符串,以替换默认的换行符。若将结束字符串指定为空字符串end=' ',则继续打印到当前行。
import 导入模块通常有下列几种: import somemodule from somemodule import somefunction from somemodule import somefunction, anotherfuntion, yetanotherfunction from somemodule import(导入模块中的一切)
若有两个模块,都包含函数open,使用方法: module1.open(...) module2.open(...)
另一种方法:在语句末尾添加as子句并指定别名。例如: >>> import math as foobar #导入整个模块并给它指定别名 >>> foobar.sqrt(4) 2.0
>>> from math import sqrt as foobar #导入特定函数并命名 >>> foobar(4) 2.0
from module1 import open as open1 #导入前面的函数open from module2 import open as open12
赋值 同时赋值或称并行赋值,即同时给多个变量赋值。
>>> x, y= y, x #实现了变量x和y的值互换 这是一种序列解包(或可迭代对象解包)和赋值操作。当你写出 x, y 时,Python会把它们当作一个元组(tuple)的模式,即使它们没有被括号包围。 右侧的表达式 y, x 同样会被解析为一个元组。 然后,Python会执行元组解包(tuple unpacking),即把右侧元组的元素分别赋值给左侧对应的变量。 因此, x 将获取原 y 的值,而 y 则获取原 x 的值,实现两者间的值互换。
可使用星号运算符*来收集多余的值,这样无需确保值和变量的个数相同: >>> a, b, *rest = [1, 2, 3, 4] >>> rest [3, 4]
链式赋值,将多个变量关联到同一个值。
增强赋值,可不编写代码x = x+1,而将右边表达式中的运算符(这里是+)移到赋值运算符(=)前面,写成x += 1。适用于所有标准运算符,如*、/、%等。(首先x可能是hello,其次,x第二次出现时已经不是第一次出现的x了)
代码块
代码块是一组语句,可在满足条件时执行(if语句),可执行多次(循环),等等。通过缩进代码(在前面加空格)来创建。也可使用制表符缩进。 Python使用冒号指出接下来是一个代码块,该代码块的每行代码缩进相同。代码块用途如下:
条件和条件语句
真值也称布尔值。以在真值方面做出巨大贡献的George Boole命名。 Python现在版中,标准真值为True和False。在有些语言(如2.3之前的Python和C++),标准真值为1(表示真)和0(假)。Ture和False是1和0的别名。有: >>> True + 1 2
布尔值True和False属于类型bool,bool与list、str和tuple一样,可用来转换其他的值。 任何值都可用作布尔值。
==双等号,比较运算符,用于比较两个值是否相等。=单等号是赋值运算符。
if语句,若符合if的条件,则返回True,True使计算机执行后续代码块。 else子句,增加选择。 条件表达式,C语言中三目运算符的Python版本。如下: status = "friend" if name.endswith("Gumby") else "stranger" 若条件(if后面)为真,则表达式结果为第一个值(即friend),否则为第二个值(stranger)。
elif子句 elif用于检查多个条件,是else if的缩写。
比较运算符 在条件表达式中,Python比较运算符如下:(还有双等于、小于、大于、大于等于、小于等于 x != y,x不等于y x is y,x和y是同一个对象 x is not y,x和y是不同的对象 x in y,x是容器(如序列)y的成员
相等运算符==,相同运算符is,is检查两个对象是否相同(相等的对象不一定相同),即使两个列表相等,但不是同一个对象,那么就不相同。 成员资格运算符in
字符串和序列的比较 字符串根据字符的字母排列顺序进行比较。字母都是Unicode字符,它们是按码点排列的。若要获取字母的顺序值,可使用函数ord。
布尔运算符(逻辑运算符) and、or、not 特征:只做必要的运算。例如仅当x和y都为真,表达式x and y才为真。若x为假,将立刻返回假,而不关心y。
循环 实现重复操作
while循环:在条件为真时反复执行代码块 for循环:为序列或其他可迭代对象中每个元素执行代码块,可在其中使用序列解包
Python用来创建范围的内置函数range,下面的程序打印数1-100: for number in range(1,101): #冒号 print(number)
迭代字典 要迭代字典中的关键字,可像迭代序列一样使用普通的for语句。 也可使用keys等字典方法获取所有的键。
并行迭代 i是用作循环索引的变量的标准名称。 内置函数zip,它将两个序列缝合,并返回一个由元组组成的序列。返回值适合迭代,用list转换为列表以查看其内容。
反向迭代和排序后再迭代 reversed像zip一样返回一个更神秘的可迭代对象 sorted返回一个列表
跳出循环 break:地道找出小于100的最大平方值(整数与自己相乘的结果),可从100向下迭代。找到一个平方值后,无需再迭代,因此跳出循环。 >>> from math import sqrt #从模块math中导入sqrt功能 >>> for n in range(99, 0, -1): #for循环,结尾冒号说明下一行开始是一个代码块 ... root = sqrt(n) ... if root == int(root): #又有冒号了 ... print(n) #冒号没有使他主动缩进,空格了四次 ... break ... (#要回车才有结果) 81
说明,range的第三个参数步长,即序列中相邻数的差。将步长设置为负数,让range向下迭代。
continue 结束当前迭代,并跳到下一次迭代开头。
while True/break成例 循环中的else子句 这俩有点像调查问卷。
简单推导(不是语句,是表达式,看起来像循环) 列表推导是从其他列表创建列表。如 >>> [x * x for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 此列表由range(10)内每个值的平方组成。若只想打印能被3整除的平方值: >>> [x*x for x in range(10) if x % 3 == 0] [0, 9, 36, 81]
使用圆括号代替方括号不能实现元组推导,而将创建生成器。 使用花括号来执行字典推导。
在列表推导中,for前面只有一个表达式,而在字典推导中,for前面有两个冒号分隔的表达式,分别为键及其对应的值。
pass(什么都不做,用作占位符)、del(删除变量或数据结构的成员,但不能删除值)和exec 1. exec 函数exec将字符串作为代码(Python程序)执行。 exec主要用于动态地创建代码字符串。如果这种字符串来自于用户,就比较危险。因此安全起见,要提供一个字典充当命名空间(作用域)。
可向exec提供两个命名空间,全局命名空间必须是字典,局部命名空间可以是任何映射。适用eval。
2. eval eval计算用字符串表示的Python表达式的值,并返回结果。exec什么都不返回,因为它本身是条语句。
关于Python安装 官网下载3.0以上版本。
运行Python 在Mac中打开终端,在初始的命令行模式下输入Python3回车,进入python解释器,是一种交互模式,提示符为>>>。
补充 中括号(方括号)作用:创建列表、表示列表、表示索引和切片、表示列表推导式 小括号(圆括号):函数调用(参数)、表示元组 大括号(花括号):表示集合、字典
range用于生成整数序列 range(3)=range(0,3)的意思是[0, 1, 2],也就是默认从0开始,但不包含这里的3。 range(0, 10, 3)其中第三个数表示步长,意思是[0, 3, 6, 9] 常用语for循环中,用于指定循环次数,用法如for i in range(8),就是循环01234567。