Python —— (1)基本知识

编码类型

当Python解释器读取源代码时,我们通常在文件开头写上这两行:

1
2
#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

这样在Linux/OS X系统命令行运行时,则可直接输入./xx.py 运行脚本,而不需要输入python xx.py

line 2 : 这行会让Python解释器按UTF-8编码读取源代码。当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。

程序输出

print 语句用于输出,与字符串格式操作符% 结合使用,可实现字符串替换功能。

  • %s 字符串替换
  • %d 整型替换
  • %f 浮点型替换

print 也支持将输出重定向到文件,用符号>> 来重定向

1
2
3
logfile = open('/tmp/mylog.txt', 'a')
print >> logfile, 'xxxxxxxx'
logfile.close()

print 语句默认会给每一行添加一个换行符,只要在print 语句的最后添加一个, 逗号,就可以改变它这种行为。

e.g. print item,

带逗号的print 语句输出的元素之间会自动添加一个空格。

e.g. print 'We are the', 'King.'

程序输入和raw_input()函数

从用户那里得到数据输入的最容易的方法是使用raw_input()内建函数。它读取标准输入,并将读取到的数据赋值给指定的变量。

1
name = raw_input('Enter your name:')

文件和open()、file()函数

  • open(file_name, access_mode = 'r | w | a')

    file_name 变量包含我们希望打开的文件的字符串名字

    access_moder 表示读取,w 表示写入,a 表示添加,其他可能用到的标识可能还有+ 表示读写,b 表示二进制访问等等。如果未提供access_mode 则默认值为r

  • file()

    功能等同于open() ,不过file() 这个名字可以更确切地表面它是一个工厂函数(生成文件对象)。

代码块及缩进对齐

代码块通过缩进对齐表达代码逻辑。

模块

  • 使用import 语句导入模块
  • 一个模块的属性(函数和变量)可以通过.句点属性标识法访问

注释

# 为注释符号,从它开始直到一行结束的内容都是注释。

还有一种叫文档字符串的特别注释。你可以在模块、类或者函数的起始添加一个字符串,起到在线文档的功能。与普通注释不同,文档字符串可以在运行时访问,也可以用来自动生成文档。

1
2
3
def foo():
"This is a doc string."
return True

错误和异常

要添加错误检测及异常处理,只要将它们放在try-except语句当中。try 之后的就是你打算管理的代码组,except 之后的则是你处理错误的代码组

1
2
3
4
5
6
7
8
try:
filename = raw_input('Enter file name:')
fobj = open(filename, 'r')
for eachLine in fobj:
print eachLine,
fobj.close()
exceptIOError, e:
print 'file open error:', e

操作符

  • 标准运算操作符

    • +
    • -
    • *
    • / 传统除法(去尾取整)
    • // 浮点数除法(四舍五入)
    • % 取余
    • ** 乘方
  • 标准比较操作符

    • <

    • <=

    • >

    • >=

    • ==

    • != 不等于

      <> 同样表示“不等于”,但它慢慢被淘汰了。

  • 逻辑操作符
    • and
    • or
    • not

变量和赋值

python的变量名规则与C语言类似,而且是大小写敏感的。

python不需要预先声明变量的类型,变量类型和值在赋值那一刻被初始化。

= 为赋值号,python也支持增量赋值,但不支持C语言中的自增(++)或自减(–)操作符。

e.g. n = n*10 等效于 n *= 10

数字

类型有

  • 有符号整型
    • 长整型
    • 布尔值
  • 浮点值
  • 复数
  • 十进制浮点型(不是内建类型,需先导入decimal 模块)

字符串

' or " 用来包含特殊字符

''' 用来包含多行特殊字符

r'xxxxx' 引号前加原始字符串操作数r/R,则内部字符串默认不转义

[] 索引操作符

[:] 切片操作符

第一个字符的索引是0,最后一个字符的索引是-1

+ 字符串连接

* 字符串重复

list和tuple

  • 区别
    • list列表:元素个数和值可改,用[] 包裹,…
    • tuple元组:元素个数和值不可改 ,用() 包裹,…
  • 共同点

    • 都可以通过切片运算([] and [:])得到子集

      切片运算: 以L[0:3]为例,它从索引0开始取,直到索引3为止,但不包括索引3。如果第一个索引是0,还可以省略。L[:10:2] 表示前10个数,每两个取一个。

只有1个元素的tuple定义时必须加一个逗号,来消除歧义。

list具有列表解析,表示可以在一行中使用一个for循环将所有值放到一个列表当中或更复杂的东西

e.g. squared = [x ** 2 for x in range(4)]

dict和set

  • dict字典

    • python中的映射数据类型。

    • 工作原理类似perl关联数组或哈希表,由key-value对构成。一个key只能对应一个value。

    • {} 包裹

      需要牢记的第一条就是dict的key必须是不可变对象

  • set集合

    • 和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
    • set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作。
    • () 包裹

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。

使用class 关键字定义类,class 之后是可选的文档字符串、静态成员定义、方法定义。

e.g.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ClassName(object):
"optional documentation string"
#static member declarations
version = 1.0

#method declarations
def __init__(self, nm='Edward Choi'):
"""constructor"""
self.name = nm
print 'Cteated a class instance for', nm
def showname(self):
"""display instance attribute and class name"""
print 'Your name is', self.name
print 'My name is', self.__class__.__name__

#Create an instance of this class
instance1 = ClassName()
instance2 = ClassName('NO NAME')

当一个类实例被创建时,__init__() 方法会自动执行,类似构造器。它并不创建实例,它的目的是执行一些该对象的必要的初始化工作。通过创建自己的__init__() 方法,你可以覆盖默认的__init__() 方法(默认的方法什么也不做)

__init__() 需要一个默认的参数,self —— 它是类实例自身的引用(类似其他面向对象语言的this 标识符)。

self.__class__.__name__ 对一个实例来说,它表示实例化它的类的名字;self.__class__ 则是引用实际的类。

创建一个类实例就像调用一个函数,类实例使用. 函数操作符调用一个函数或方法。

函数

定义一个函数由def 关键字,紧随其后的函数名,再加上该函数需要的几个参数组成,然后由一个: 结束,之后是代表函数体的代码组。

函数在调用之前必须先定义。

参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数.

e.g.

1
2
3
def function_name([arguments]):
"optional documentation string"
function_suite

suite 意为代码组 ,是python的术语

如果函数没有return 语句,就会自动返回None 对象。函数也可以同时返回多个值,但其实就是一个tuple。

pass语句什么都不做,可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

在函数定义中,参数的默认值以赋值语句的形式提供。默认参数必须指向不变对象。

在参数前面加了一个*号,把函数的参数改为可变参数, 调用该函数时,可以传入任意个参数,包括0个参数。在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去。

e.g.

1
2
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)

**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra

if语句

语法如下。

条件表达式也不需要用括号括起来。

1
2
3
4
5
6
if expression:
if_suite
elif expression2: #means else-if
elif_suite
else:
else_suite

while循环

语法如下。

1
2
while expression:
while_suite

for循环

python中的for 接受可迭代对象作为其参数(如序列、迭代器),每次迭代其中一个元素。

由于我们要使用的数值范围可能会经常变化,python提供了一个range()内建函数来生成这种列表。

e.g.

1
2
for eachNum in range(3):
print eachNum

这些循环有一个约束,要么循环索引,要么循环元素,这就导致了enumerate()函数的产生。enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

实用的函数

函数 描述
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对象)
map() 接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
reduce() 把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
filter() 把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

refer:Python教程 - 廖雪峰的官方网站

梦想还是要有的,万一实现了呢?