担心自己看Python核心编程吃力,索性先从Python基础编程开始~
准备了两个屏幕,电子书,走起~
开始学习第一章
------------基础知识------------
1、安装python2.7.5:(安装步骤省略)
Python 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>print "Hello, World!"
2、输入下面的命令看看它是否正常工作:
>>>print "Hello, World!"
当按下回车键后,会有下面的输出:
Hello, World!
>>>
注:代码行最后不用加分号结束,加上分号不会有任何作用
3、数字和表达式
交互式Python解释器可以当做非常强大的计算器使用
>>>2 + 2
4
>>>12345 + 54321
66666
>>>1/2
0
>>>
ps:一个整数(无小数部分的数)被另外有一个整数除以,计算结果的小数部分被截取了,只留下整数部分。
解决方案:要用实数(包含小数点的十进制数)而不是整数进行运算,或者让Python改变触发的执行方式。
实数在Python中被称为 浮点数(Float,或者Float-point N)
>>> 1.0 / 2.0
0.5
>>> 1/2.0
0.5
>>> 1.0/2
0.5
>>> 1/2.
0.5
如果希望Python只执行普通的触发,那么可以在程序前加上一下语句,或者直接在编辑器里面执行它:
>>>from __future__ import division
>>> 1/2
0.5
>>>
现在,单斜线不再用作前面提到的整除了,但Python还提供了另外一种用于实现整除的操作符——双斜线:
>>>1 // 2
0
>>>1.0 // 2.0
0.0
以上就算浮点数,双斜线也会执行整除
============================
下面了解取余(模除)
运算符:x%y的结果为x除以y的余数。
>>> 1 % 2
1
>>> 10 % 3
1
>>> 10 / 3
3.3333333333333335
>>> 9 /3
3.0
>>> 3 % 3
0
>>> 2.75 % 0.5
0.25
>>>
这里10/3得3是因为结果的小数部分被截除了,而三三得九,所以相应的余数就是1了。
=============================
选数幂运算符(乘方):
>>> 2 ** 3
8
>>> -3 ** 2
-9
>>> (-3) ** 2
9
>>>
注意,幂运算比取反的优先级要高,所以-3**2等同于 -(3**2)。如果想计算(-3)**2,就需要显式说明。
==============================
长整形
>>> 10000000000000000000
10000000000000000000L
这里发生了什么?数字后面加多了个L。
ps:普通整数不能大于2147483647 (也不能小于-2147483647),如果真的需要大数,可以使用长整形数。长整形数书写方法和普通整数一样,但是结尾有个L。(理论上,用小写的l也可以,但是它看起来太像数字1,所以建议不要用小写l。)
>>> 121231231323434435L * 1231325456354343433L + 23
149275101233726879856440251048315378L
4、变量
变量基本上就是代表(或者引用)某值的名字。举例来说,如果希望用字母k代表数字3只需要执行下面语句即可:
>>> k = 3
>>> print k
3
>>>
使用变量之前,需要对其赋值,毕竟使用没有值的变量也没有意义。
5、语句
语句和表达式之前的区别在赋值时会表现得更加明显一些。因为语句不是表达式,所以没有值可供交互式解释器打印出来:
>>>x = 3
>>>
6、获取用户输入:input函数
>>> input("The meaning of life: ")
The meaning of life: 77
77
>>> x = input("x: ")
x: 11
>>> y = input("y: ")
y: 22
>>> print x * y
242
>>>
Python提示符(>>>)后面的语句可以算作一个完整程序的组成部分了,输入的值(11和22)由用户提供,而程序就回打印出输入的两个数的乘积242.
7、函数
函数可以代替运算符,pow可以代替幂运算符
>>>2 ** 3
8
>>>pow(2,3)
8
函数就像可以用来实现特定功能的小程序一样。Python的很多函数都能做很奇妙的事情。事实上,也可以自己定义函数(后面的内容会对此展开讲述)。因此,我们通常会吧pow等标准函数称为内建函数。
上例中我使用函数的方式叫作调用函数。可以给它提供参数,它会返回值给用户。
>>> pow(2,3*5)
32768
>>> 10 + pow(2,3*5)/3.0
10932.666666666666
abs函数可以得到数的绝对值,round函数则会把浮点数四舍五入为最接近的整数值:
>>> abs(-10)
10
>>> 1/2
0.5
>>> round(1.0/2.0)
1.0
8、模块
模块可以想象为导入到Python以增强其功能的扩展。需要使用特殊的命令import来导入模块。
>>> import math
>>> math.floor(32.9)
32.0
>>>
用法:用import导入了模块,然后按照“模块.函数”的格式使用这个模块中的函数
如果想把年龄转换为整数(32)而不是浮点数(32.0),可以使用int函数。
>>> int(math.floor(32.9))
32
导入模块的另外一种形式:
>>> from math import sqrt
>>> sqrt(9)
3.0
好处:在使用了“from模块import函数” 这种形式的import命令之后,就可以直接使用函数,而不需要模块名作为前缀 。
提示:事实上,可以使用变量引用函数(或者Python之中大多数的对象)。比如,通过foo=math.sqrt进行赋值,然后就可以使用foo来计算平方根:foo(4)的结果为2.0。
>>> foo = math.sqrt
>>> foo(4)
2.0
9、cmath和复数
sqrt函数用于计算一个数的平方根,原有的办法是无法处理负数的,但真的不可以吗?
>>> foo(-1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
当然可以,负数的平方根是虚数。sqrt只能处理浮点数,虚数可以使用cmath的模块来实现这些功能
>>> import cmath
>>> cmath.sqrt(-1)
1j
>>>
注意:这次并没有使用from...import...语句。因为一旦使用了这个语句,就没法使用普通的sqrt函数了。这类命名冲突很讨厌,因此,除非真的需要from这个形式的模块导入语句,否则 应该坚持使用普通的import。
1j是个虚数,虚数均以j结尾(或者J),就像长整形数使用L一样。
注意:Python中没有单独的虚数类型。它们被看作实数部分为0的复数。
10、保存并执行程序
交互式解释器是Python的强项之一,但在交互式解释器中输入的一切都会在退出的时候丢失。我们真正想做的事情是编写自己和他人都能运行的程序。
文本编辑器
先输入一下内容:
print "Hello, world!"
PS D:\learnpython> python .\1.py
Hello, world!
创建文本输入“print "Hello, world!"然后保存,命名文件为1.py,以py结尾很重要的。然后cmd下进入该文件对应目录,执行 python 1.py,Hello,world!在解释器窗口内打印出来了。
接下来,我们对上述脚本进行扩展,如下例:
name = raw_input("What's your name? ")
print "Hello, " + name + "!"
保存运行这个程序,解释器看到下面提示:
what's your name?
输入字符(如:kk),然后回车,解释器显示内容如下
Hello, kk
11、注释
#(井号)在Python中有些特殊,在代码中输入它的时候,它的邮编的一切都会被忽略
#这是例子
name = raw_input("What's your name? ")
print "Hello, " + name + "!"
这里的第一行称为注释。为了让别人能够更容易的理解程序
12、字符串
“Hello,world!”就是字符串,字符串在几乎所有真实可用的Python程序中都会存在,并且有多种用法,其中最主要的就是表示一些文本。
13、单引号字符串和转义引号
字符串是值,就像数字一样:
>>> "Hello, world!"
'Hello, world!'
有一个疑问,当Python打印出字符串的时候,是用单引号括起来的,但我们在程序中用的是双引号。事实上没有区别。
>>> "Let's go!"
"Let's go!"
>>> '"Hello, world!" she said'
'"Hello, world!" she said'
上面代码第一段字符串包含了单引号(或者叫撇号)这时候就不能单引号将整个字符串括起来了,如果这样做,解释器会抱怨道(它这样做也是正确的):
>>> 'Let's go!'
File "<stdin>", line 1
'Let's go!'
^
SyntaxError: invalid syntax
上面代码,Python并不知道如何处理后面的s(也就是该行余下的内容)。
第二段字符串中,句子包含了双引号,所以,出于之前所述原因,就需要单引号把字符串括起来了。
还有另外一种方法:使用反斜线(\)对字符串中的引号进行转义:
>>> 'Let\'s go!'
"Let's go!"
这样Python会明白中间的单引号是字符串中的一个字符,而不是字符串的结束标记。
对双引号也可以使用同样的方法进行转义:
>>> "\"Hello, world!\" she said"
'"Hello, world!" she said'
14、拼接字符串
使用另外一种方式输出同样的字符串:
>>> "Let's say " '"Hello, world!"'
'Let\'s say "Hello, world!"'
一个接一个,Python会自动拼接它们。
但不应用于变量:
>>> x = "Hello, "
>>> y = "world!"
>>> x y
File "<stdin>", line 1
x y
^
SyntaxError: invalid syntax
这仅仅是书写字符串的一种特殊方法,并不是拼接字符串的一般方法。怎么拼接?就像进行加法运算一样:
>>> "Hello, " + "world!"
'Hello, world!'
>>> x + y
'Hello, world!'
15、字符串表示,str和repr
>>> "Hello, world!"
'Hello, world!'
>>> 10000L
10000L
>>> print "Hello, world!"
Hello, world!
>>> print 10000L
10000
以上代码Python打印值会保持该值的Python代码中状态,而使用print语句,结果就不一样了。
我们这里讨论的实际上是值被转换为字符串的两种机制。可以通过以下两个函数来使用这两种机制:一个是通过str函数,它会把值转换为合理形式的字符串,以便用户可以理解;而repr会创建一个字符串,它以合法的Python表达式的形式来表示值。下面是一些例子:
>>> print repr("Hello, world!")
'Hello, world!'
>>> print repr(10000L)
10000L
>>> print str("Hello, world!")
Hello, world!
>>> priont str(10000L)
File "<stdin>", line 1
priont str(10000L)
^
SyntaxError: invalid syntax
>>> print str(10000L)
10000
repr(x)的功能可以用`x`实现(注意,`是反引号,而不是单引号)。如果希望打印一个包含数字的句子,那么反引号就很有用了。比如:
>>> temp = 77
>>> print "The temperature is " + temp
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
>>> print "The temperature is " + `temp`
The temperature is 77
>>> print "The temperature is " + repr(temp)
The temperature is 77
第一个print语句不能工作的原因,那是因为不可以将字符串和数字进行相加。
第二个print则可以正常工作,因为已经通过反引号将temp的值转换为字符串"77"了。
16、input 和 raw_input 的比较
#这是例子
>>> name = input("What's your name? ")
What's your name? kk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'kk' is not defined
问题在于input会假设用户输入的是合法的Python表达式(或多或少有些于repr函数相反的意思)。如果以字符串作为输入的名字,程序运行时没有问题的:
>>> name = input("What's your name? ")
What's your name? "kk"
>>> print name
kk
然而,要求用户带有引号输入他们的名字有点过分,因此,这就需要使用raw_input函数,它会把所有的输入当作原始数据(raw date),然后将其放入字符串中:
>>> input("Enter a number: ")
Enter a number: 3
3
>>> raw_input("Enter a number: ")
Enter a number: 3
'3'
注:除非对input有特殊的要求,否则应该尽可能使用raw_input函数
17、长字符串、原始字符串和Unicode
如果需要些一个非常非常长的字符串,它需要跨多行,那么可以使用三个引号代替普通引号。
>>> print '''This is a very string.'''
This is a very string.
>>> print '''This is a very string.
... It continues here
... And it's not over yet.
... "Hello, world!"
... Still here.'''
This is a very string.
It continues here
And it's not over yet.
"Hello, world!"
Still here.
也可以使用三个双引号,如"""kk""".
注:在这样形似下同时使用单引号和双引号,不需要使用反斜线进行转义。
普通单引号也可以跨行:
>>> print "Hello, \
... world!"
Hello, world!
这个用法也适用于表达式和语句:
>>> 1 + 2 + \
... 4 + 5
12
>>> print\
... "Hello, world!"
Hello, world!
换行符可以写为\n,并放在字符串中:
>>> print 'Hello, \nworld!'
Hello,
world!
希望在字符串中包含反斜线再加上n:我们可以使用反斜线对其本身进行转义
>>> print 'C:\\nwhere'
C:\nwhere
原始字符串r开头,打印出内容都与书写的内容保持一致:
>>> print r'C:\nwhere'
C:\nwhere
注意:不能再原始字符串结尾输入反斜线。
>>> print r'C:\nwhere\'
File "<stdin>", line 1
print r'C:\nwhere\'
^
SyntaxError: EOL while scanning string literal
希望原始字符只以一个反斜线作为结尾的话,本质上就是把反斜线单独作为一个字符串处理操作如下:
>>> print r'C:\Program Files\foo\bar' '\\'
C:\Program Files\foo\bar\
Unicode字符串
字符串常量 的最后一种类型就是Unicode字符串
>>> u"Hello, world!"
u'Hello, world!'
可以看到,Unicode字符串使用u前缀,就像原始字符串使用r一样。