担心自己看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字符串
字符串常量