python学习笔记第二章

    第一次在CSDN上发表博客……

    经常逛这个东西,也很受益,最近在学python,把我做的python学习笔记发上来,都是一些很基础的东西。

    参考的教程书籍是《Core python programming》,在学python之前,我有Linux C/C++编程基础和使用Qt做GUI的基础,因此笔记是按我所掌握的知识水平来记的。

    之所以没有第一章的笔记,是因为第一章大都是介绍python,知道就行了。

    下面是笔记正文:


Python 学习笔记
Chapter 2
2.1 介绍及hello world
2.1.1 显示变量
可以使用变量名直接查看该变量的原始值。
可以用print打印出来
在仅用变量名时,输出的字符串是被用单引号括起来了的。这是为了让非字符串对象也能以字符串的方式显示在屏幕上--即它显示的是该对象的字符串表示,而不仅仅是字符串本身。
Hello world:
  >>> hstr = ‘hello world’
  >>> print hstr
  >>> hstr
2.1.2程序输入和raw_input()内建函数
1. 下划线_代表最后一个表达式的值。注意:只在解释器中有用,既显示上一次的操作结果。
2. Print语句可以用%进行格式控制,与C相似。
  如:
  >>> print “%s is number %d!” % (“python”, 1)
  Python is number 1!
3. Python 非常灵活,所以即使你将数字传递给 %s,也不会像其他要求严格的语言一样引发严重后果。
4. 符号 >> 用来重定向输出,下面这个例子将输出重定向到标准错误输出:
  import sys
  print >> sys.stderr, 'Fatal error: invalid input!'
  import sys
  print >> sys.stderr, 'Fatal error: invalid input!'
  下面是一个将输出重定向到日志文件的例子:
  logfile = open('/tmp/mylog.txt', 'a')
  print >> logfile, 'Fatal error: invalid input!'
  logfile.close()
  
2.1.3 内建函数 raw_input()
从用户那里得到数据输入的最容易的方法是使用 raw_input()内建函数。它读取标准输入,并将读取到的数据赋值给指定的变量。
你可以使用 int() 内建函数将用户输入的字符串转换为整数。
例子:
  >>> user = raw_input('Enter login name: ')
  Enter login name: root
  >>> print 'Your login is:', user
  Your login is: root
上面这个例子只能用于文本输入。 下面是输入一个数值字符串(并将字符串转换为整数)的例子:
  >>> num = raw_input('Now enter a number: ')
  Now enter a number: 1024
  >>> print 'Doubling your number: %d' % (int(num) * 2)
  Doubling your number: 2048
Raw的意思是“写后读”。
核心笔记:从交互式解释器中获得帮助在学习 Python 的过程中,如果需要得到一个生疏函数的帮助,只需要对它调用内建函数help()。通过用函数名作为 help()的参数就能得到相应的帮助信息:
  >>> help(raw_input)
Python 使用 # 符号标示注释,从 # 开始,直到一行结束的内容都是注释。

2.2 运算符
2.2.1 标准运算符
+ - * / 标准运算符, 与C一样。注意,/   这里叫地板除(取比商小的最大整数)。
%    取余。
//     浮点除法  取四舍五入。总是执行真正的除法。
**    乘方运算符,优先级按数学规律。
根据真假返回BOOL值的标准比较运算符:
  <	<=	>	>=	==	!=	<>(被淘汰)
  真返回True  假返回False 注:大小写敏感。
逻辑运算符:and = &&		or = ||		not = !
编码风格:括号在 Python语言中不是必须存在的, 不过为了可读性, 使用括号总是值得的。

2.3 变量和赋值
变量名以字母开头。
Python 是动态类型语言, 也就是说不需要预先声明变量的类型。 变量的类型和值在赋值那一刻被初始化。变量赋值通过等号来执行。
支持增量赋值:
  n = n * 10
  将上面的例子改成增量赋值方式就是:
  n *= 10
Python 不支持 C 语言中的自增 1 和自减 1 运算符。
2.4 数字
1. Python 支持五种基本数字类型,其中有三种是整数类型。
  
  int (有符号整数)
  long (长整数)
  bool (布尔值)
  float (浮点值)
  complex (复数)
2.注意:Python 长整数仅受限于用户计算机的虚拟内存总数。从 Python2.3 开始,再也不会报整型溢出错误, 结果会自动的被转换为长整数。
3.bool值:与C相同 1与0
4. decimal, 用于十进制浮点数。
2.5字符串
1.Python 支持使用成对的单引号或双引号,
三引号(三个连续的单引号或者双引号)可以用来包含特殊字符
2.使用索引运算符( [ ] )和切片运算符( [ : ] )可以得到子字符串。
3.字符串有其特有的索引规则:第一个字符的索引是 0, 最后一个字符的索引是 -1、
4.注意:字符串不支持通过索引进行单个赋值(或更改原值)。既:字符串是不可变的。
2.6 列表和元组
列表和元组可以当成普通的数组。它能保存任意数量任意类型的 Python 对象。
下标索引从0开始(与C相同)。
列表和元组的区别:
  1》列表元素用中括号( [ ])包裹,元素的个数及元素的值可以改变。元组元素用小括号(( ))包裹,不可以更改(尽管他们的内容可以)。
  2》元组可以看成是只读的列表。
  3》列表通过切片运算( [ ] 和 [ : ] )可以得到子集,与字符串使用方法一样。结果为列表,其值可以改变。
  4》元组也可以进行切片运算,得到的结果仍是元组。值仍旧是只读。
2.7 字典
1. 字典是 Python 中的映射数据类型,类似于关联数和哈希表,由键-值(key-value)对构成。
2. 几乎所有类型的 Python 对象都可以用作键,不过一般还是以数字或者字符串最为常用。
3. 值可以是任意类型的 Python 对象,字典元素用大括号({ })包裹。
4. 例子:
>>> aDict = {'host': 'earth'} # create dict
>>> aDict['port'] = 80 # add to dict
>>> aDict
{'host': 'earth', 'port': 80}
>>> aDict.keys()
['host', 'port']
>>> aDict['host']
'earth'
>>> for key in aDict:
... print key, aDict[key]
...
host earth
port 80
2.8 代码块及缩进对齐
代码块通过缩进对齐表达代码逻辑而不是使用大括号。
2.9 if语句
1. 标准 if 条件语句的语法如下:
  if expression:
  if_suite
如果表达式的值非 0 或者为布尔值 True, 则代码组 if_suite 被执行; 否则就去执行下一条语句。
代码组是一个 Python 术语, 它由一条或多条语句组成,表示一个子代码块。
注意:条件表达式不需要用括号括起来。
If …… Else 组合
  if expression:
  If_suite
  else:
  else_suite
Python 还支持 elif (意指 “else-if ”)语句,语法如下:
  if expression1:
  if_suite
  elif expression2:
  elif_suite
  else:
  else_suite
注意:python没有switch……case语句。
2.10 while循环
使用缩进来分隔每个子代码块,语法为:
  while expression:
  while_suite
2.	while语句有一个可选的else从句.
2.11 for循环和range()内建函数
2.11.1 for循环
1. 类似于shell 脚本里的 foreach 迭代, 以可迭代对象作为参数,每次迭代其中一个元素。
2. 举例:
  >>> for a in alist:
  	print a
  将alist(事先定义的表格)内容全部打印出来。
在print后面增加逗号(,)可以取消自动换行。
2.11.2 for循环利用range()
当我们循环范围可变时,可以使用内建函数range()。 range()接受数组范围,生成一个列表。
例子:
  >> for eachNum in range(3):
  ...
  print eachNum
  ...
  0
  1
  2
For循环输出字符串中的每个元素:
  >>> foo = 'abc'
  >>> for c in foo:
  ...
  print c
  ...
  a
  b
  C
  
  >>> foo = 'abc'
  >>> for i in range(len(foo)):
  ... print foo[i], '(%d)' % i
  ...
  a (0)
  b (1)
  c (2)
For的另一个例子:用到else项
  #!/usr/bin/python
  # Filename: for.py
  for i in range(1, 5):
  print i
  else:
  print 'The for loop is over'
  输出
  $ python for.py
  1
  2
  3
  4
  The for loop is over
  从这里看出:1)else只执行一次。2)range是左闭右开[ , )型范围内建函数。3)range(1,5)给出序列[1, 2, 3, 4]
2.11.3 range()
默认地,range的步长为1。如果我们为range提供第三个数,那么它将成为步长。例如,range(1,5,2)给出[1,3]。记住,range 向上 延伸到第二个数,即它不包含第二个数。
2.11.3 enumerate() 列举内建函数
1. Enumerate()函数同时获取循环的索引和元素。
  >>> for i, ch in enumerate(foo):
  ... print ch, '(%d)' % i
  ...
  a (0)
  b (1)
  c (2)
2.12 列表解析
1.在一行中使用一个 for 循环将所有值放到一个列表当中:
  >>> squared = [x ** 2 for x in range(4)]
  >>> for i in squared:
  ... print i
  0
  1
  4
  9
可以在列表解析中进行判断赋值。
  >>> sqdEvens = [x ** 2 for x in range(8) if not x % 2]		 #求平方
  >>>
  >>> for i in sqdEvens:
  ... print i
  0
  4
  36
  16
2.13 文件和内建函数open(), file()
2.13.1 打开文件
open()
  handle = open(file_name, access_mode = 'r')
  其中
  file_name 文件名称
  Access_mode 为打开方式 'r' 表示读取,'w' 表示写入, 'a' 表示添加。其它可能用到的标声还有 '+' 表	示读写, 'b'表示二进制访问。
返回值:文件句柄。
关于属性:
  核心笔记:什么是属性?
  属性是与数据有关的项目, 属性可以是简单的数据值, 也可以是可执行对象, 比如函数
  和方法。哪些对象拥有属性呢? 很多。 类, 模块, 文件还有复数等等对象都拥有属性。
  我如何访问对象属性? 使用句点属性标识法。 也就是说在对象名和属性名之间加一个句
  点: object.attribute
File()
  功能等同于 open(), 不过 file()
  这个名字可以更确切的表明它是一个工厂函数。(生成文件对象)类似 int()生成整数对象,dict()生成字典对象。
2.14 break语句和continue
Break终止循环。
一个重要的注释是,如果你从for或while循环中 终止 ,任何对应的循环else块将不执行。
3. Continue与C相同。对于while和for都适用。
2.14 函数
函数在调用之前必须先定义。
2.Python 是通过引用调用的。 这意味着函数内对参数的改变会影响到原始对象。不过事实上只有可变对象会受此影响, 对不可变对象来说, 它的行为类似按值调用。
3.定义函数举例:
  def addMe2Me(x):
  'apply + operation to argument'
  return (x + x)
  说明:加号(+)运算符适用于所有标准数据类型,不管是值相加还是序列合并。
4.函数可以有默认值。既函数定义时,可以以赋值的形式提供。与C++用法相同。
2.15 类
2.15.1 定义类
定义格式:
  class ClassName(base_class[es]):
  "optional documentation string"
  static_member_declarations
  method_declarations
使用 class 关键字定义类。 可以提供一个可选的父类或者说基类; 如果没有合适的基类,那就使用 object 作为基类。class 行之后是可选的文档字符串, 静态成员定义, 及方法定义。
2. __init__() 方法:类似于构造函数,但不同于构造函数。
  它并不创建实例--它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初始化工作
3. 通过创建自己的 __init__() 方法, 你可以覆盖默认的 __init__()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象。
(Python类还是不熟,没有实际操作)
2.16 模块
1. 是什么:模块是一种组织形式, 它将彼此有关系的 Python 代码组织到一个个独立文件当中。模块可以包含可执行代码, 函数和类或者这些东西的组合。
2. 说明:1》模块的名字就是不带 .py 后缀的文件名。
  2》使用 import 语句导入这个模块来使用。
访问模块:
  import module_name
  导入:
  一旦导入完成, 一个模块的属性(函数和变量)可以通过熟悉的 .句点属性标识法访问。
  module.function()
  module.variable
例子:调用sys模块:(自己写的)
>>> import sys
>>> sys.platform
'linux2'
>>> sys.stdout.write('hello!')
hello!
>>> sys.version
'2.7.3 (default, Sep 26 2012, 21:51:14) \n[GCC 4.7.2]'
>>> 
  这些代码的输出与我们使用 print 语句完全相同。 唯一的区别在于这次调用了标准输出
  的 write()方法,
  而且这次需要显式的在字符串中提供换行字符, 不同于 print 语句, write()
  不会自动在字符串后面添加换行符号。













2.0 第二章练习
2–1.
变量, print 和字符串格式化运算符。启动交互式解释器。给一些变量赋值(字符串,数值等等)并通过输入变量名显示它们的值。再用 print 语句做同样的事。这二者有何区别? 也尝试着使用字符串格式运算符 %, 多做几次, 慢慢熟悉它。
2–2. 
程序输出, 阅读下面的 Python 脚本:
#!/usr/bin/env python
1+2*4

答:脚本运行后没有输出,加入print语句后输出。
2–3. 数值和运算符
启动交互解释器,使用 Python 对两个数值(任意类型)进行加、减、乘、除运算。然后使用取余运算符来得到两个数相除的余数, 最后使用乘方运算符求 A 数的 B 次方。
2–4. 使用 raw_input()函数得到用户输入
(a) 创建一段脚本使用 raw_input() 内建函数从用户输入得到一个字符串,然后显示这个用户刚刚键入的字符串。
(b) 添加一段类似的代码,不过这次输入的是数值。将输入数据转换为一个数值对象,(使用 int()或其它数值转换函数) 并将这个值显示给用户看。(注意,如果你用的是早于 1.5 的版本,你需要使用 string.ato*() 函数执行这种转换)
2–5. 循环和数字
分别使用 while 和 for 创建一个循环:
(a) 写一个 while 循环,输出整数从 0 到 10。(要确保是从 0 到 10, 而不是从 0 到 9 或从 1 到 10)
(b) 做同 (a) 一样的事, 不过这次使用 range() 内建函数。
2–6. 
条件判断 判断一个数是正数,还是负数, 或者等于 0. 开始先用固定的数值,然后修改你的代码支持用户输入数值再进行判断。
2–7.
循环和字串 从用户那里接受一个字符串输入,然后逐字符显示该字符串。先用 while 循环实现,然后再用 for 循环实现。
2–8. 循环和运算符 
创建一个包含五个固定数值的列表或元组,输出他们的和。然后修改你的代码为接受用户输入数值。 分别使用 while 和 for 循环实现。
2–9. 循环和运算符 
创建一个包含五个固定数值的列表或元组,输出他们的平均值。本练习的难点之一是通过除法得到平均值。 你会发现整数除会截去小数,因此你必须使用浮点除以得到更精确的结果。 float()内建函数可以帮助你实现这一功能。
2–10.带循环和条件判断的用户输入 
使用 raw_input()函数来提示用户输入一个 1 和 100 之间的数,如果用户输入的数满足这个条件,显示成功并退出。否则显示一个错误信息然后再次提示用户输入数值,直到满足条件为止。
2–11.带文本菜单的程序 
写一个带文本菜单的程序,菜单项如下(1)取五个数的和 (2) 取五个数的平均值....(X)退出。由用户做一个选择,然后执行相应的功能。当用户选择退出时程序结束。这个程序的有用之处在于用户在功能之间切换不需要一遍一遍的重新启动你的脚本。(这对开发人员测试自己的程序也会大有用处)
2–12. dir()内建函数
(a) 启动 Python 交互式解释器, 通过直接键入 dir()回车以执行 dir()内建函数。你看到什么? 显示你看到的每一个列表元素的值,记下实际值和你想像的值
(b) 你会问, dir()函数是干什么的?我们已经知道在 dir 后边加上一对括号可以执行 dir()内建函数, 如果不加括号会如何? 试一试。 解释器返回给你什么信息? 你认为这个信息表示什么意思 ?
(c) type() 内建函数接收任意的 Python 对象做为参数并返回他们的类型。 在解释器中键入 type(dir), 看看你得到的是什么?
(d) 本练习的最后一部分, 我们来瞧一瞧 Python 的文档字符串。 通过 dir.__doc__ 可以访问 dir()内建函数的文档字符串。print dir.__doc__可以显示这个字符串的内容。 许多内建函数,方法,模块及模块属性都有相应的文档字符串。我们希望你在你的代码中也要书写文档字符串, 它会对使用这些代码的人提供及时方便的帮助。
2–13. 利用 dir() 找出 sys 模块中更多的东西。
(a) 启动 Python 交互解释器,执行 dir()函数,然后键入 import sys 以导入 sys 模块。再次执行 dir()函数以确认 sys 模块被正确的导入。 然后执行 dir(sys) , 你就可以看到 sys模块的所有属性了。
(b) 显示 sys 模块的版本号属性及平台变量。记住在属性名前一定要加 sys. ,这表示这个属性是 sys 模块的。其中 version 变量保存着你使用的 Python 解释器版本, platform属性则包含你运行 Python 时使用的计算机平台信息。
(c) 最后, 调用 sys.exit() 函数。 这是一种热键之外的另一种退出 Python 解释器的方式 。
2–14. 重写 2.4 小节 
2.4小节中print 语句里的算术表达式, 试着在这个表达式中添加合适的括号以便它能正常工作。
2–15. 元素排序
(a)让用户输入三个数值并将分别将它们保存到 3 个不同的变量中。不使用列表或排序算法,自己写代码来对这三个数由小到大排序。(b)修改(a)的解决方案,使之从大到小排序
2–16. 文件
键入 2.15 节的文件显示的代码, 然后运行它, 看看能否在你的系统上正常工作,然后试一下其它的输入文件。













2.I 什么是内建函数
  内建函数,就是由语法规定存在的函数。
  各家编译器,如果支持该语法规则,则必须为使用者提供的函数。
  这些函数,包含在编译器的运行时库当中,程序员不必单独书写代码实现它,只需要调用既可,他们的实现,由编译器厂商完成。
II 知识积累
II.1 Len()函数
  >>> astr = 'abc'
  >>> print len(astr)
  3
2.II.2 使用源文件
  #!/usr/bin/python
  # Filename : helloworld.py
  print 'Hello World'
终端执行命令为:
  Python helloworld.py

  源文件的头两个字符
  是#!,后面跟着一个程序。这行告诉你的Linux/Unix系统当你 执行 你的程序的时候,它应该运
  行哪个解释器。
2.II.3 python的二进制形成
Python代码 
python -O -m py_compile file.py  

-O 优化成字节码 
-m 表示把后面的模块当成脚本运行 
-OO 表示优化的同时删除文档字符串 

也可以写一个脚本来实现: 
Python代码 
import py_compile  
py_compile.compile("file_path")
2.II.4 加入PATH变量
$ echo $PATH
/opt/mono/bin/:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/swaroop/bin
$ cp helloworld.py /home/swaroop/bin/helloworld
$ helloworld
Hello World
我们能够用echo命令来显示PATH变量,用$给变量名加前缀以向shell表示我们需要这个变量的
值。
2.II.5使用三引号('''或""")
利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双
引号。例如:
'''This is a multi-line string. This is the first line.
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."
'''
2.II.6 转义符(\)
在一个字符串中,行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行。例如:
"This is the first sentence.\
This is the second sentence."
等价于"This is the first sentence. This is the second sentence."

下面是一个在多个物理行中写一个逻辑行的例子。它被称为明确的行连接。
s = 'This is a string. \
This continues the string.'
print s
它的输出:
This is a string. This continues the string.
类似地,
print \
i
与如下写法效果相同:
print i
2.II.7自然字符串
如果你想要指示某些不需要如转义符那样的特别处理的字符串,那么你需要指定一个自
然字符串。自然字符串通过给字符串加上前缀r或R来指定。例如r"Newlines are indicated
by \n"。
2.II.8 运算符优先级
从上往下依次增强。

lambda Lambda表达式
or 布尔“或”
and 布尔“与”
not x 布尔“非”
in,not in 成员测试
is,is not 同一性测试
<,<=,>, 比较
      >=,!=,== 
| 按位或
^ 按位异或
& 按位与
<<,>> 移位
+,- 加法与减法
*,/,% 乘法、除法与取余
+x,-x 正负号
~x 按位翻转
** 指数
x.attribute 属性参考
x[index] 下标
x[index:index] 寻址段
f(arguments...) 函数调用
(experession,...) 绑定或元组显示
[expression,...] 列表显示
{key:datum,...} 字典显示
'expression,...' 字符串转换
2.II,9 什么是PEP
 Python 增强提案(Python Enhancement Proposal),它们不但提供了新特性的完整描述, 还有添加这些新特性的理由, 如果需要的话, 还会提供新的语法、 技术实现细节、向后兼容信息等等。PEP1 阐述了 PEP 的目标及书写指南。在 PEP0 中可以找到所有的 PEP。 PEP 索引的网址是: http://python.org/dev/peps.




2.III 说明注意
1. 使用变量时只需要给它们赋一个值。不需要声明或定义数据类型。
2. ; 可以用来换行。
2.IV 实用的函数----内建函数
  dir([obj])
  显示对象的属性,如果没有提供参数, 则显示全局变量的名字。
  
  help([obj])
  以一种整齐美观的形式 显示对象的文档字符串, 如果没有提供任何参数, 则会进入交互式帮助。
  
  int(obj)
  将一个对象转换为整数
  
  len(obj)
  返回对象的长度
  
  open(fn, mode) 
  以 mode('r' = 读, 'w'= 写)方式打开一个文件名为 fn 的文件
  
  range([[start,]stop[,step])
  返回一个整数列表。起始值为 start, 结束值为 stop - 1; start默认值为 0, step默认值为1。
  
  raw_input(str) 
  等待用户输入一个字符串, 可以提供一个可选的参数 str 用作提示信息。
  
  str(obj)
  将一个对象转换为字符串

  type(obj)
  返回对象的类型(返回值本身是一个 type 对象!)
2.V 问题积累
2.V.1 “^” 在python中有什么作用?Env是什么意思?







  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值