【python】PYTHON基础教程

来源:互联网 发布:净化网络环境 倡议书 编辑:程序博客网 时间:2024/06/05 20:05

一. 列表和元组  (统称序列)

1. 列表和元组的区别:

    列表可以修改,元组则不能。(列表点各个元素通过逗号分隔,写在放括号中 edward = ['ssss', 42])

2. list函数

    使用于所有类型点序列,不只是字符串。   ‘’.join(somelist)将一个由字符组成点列表转换为字符串

3. 列表方法

    方法是一个与某些对象有紧密联系点函数,对象可以是列表,数字,也可能是字符串或者其他类型点对象(对象.方法(参数))

    (1) append方法 

               在列表末尾追加新点对象

    (2) count 统计某个元素在列表中出现点次数

    (3) extend可以在列表点末尾一次性添加另一个序列的多个值

               a = [1, 2, 3] b = [4, 5, 6] a.extend(b)

    (4) sort sorted reverse

    (5) 高级排序

               numbers.sort(cmp)            x.sort(key=len)            x.sort(reverse=True)

4. 元组: 不可变序列 (用逗号分隔 1, 2, 3)


二. 类

class 类名称:

"类的文档字串,用来简单说明这个类"

成员变量

def __int__(self, 参数):  # [可选] 类似构造函数,但__init__ 被(自动)调用时,对象已然被创建出来了

函数体

def __del__(self):  # [可选] 类似析构

函数体

def 成员函数 (self, 参数):

函数体

 

习惯上,和 c++ 不同的是,python 一般使用 self (是一种习惯而非强制,在 def 的时候可以使用其他的名字比如 this)而不是 this,但两者功能上类似,值得注意的是,self需要在方法的参数中写定,并且引用成员变量的时候,一定要通过 self。比如:

class Person:

"store informationof a person"

name = ''

age = 0

sex = 'male'

def textOut(self):  # 这个 self 不可少

print 'name is:', self.name, ' age is ', self.age, ' and sex is ', self.sex  # 对成员变量的引用,亦必须通过 self

@staticmethod

def sayHello ():

print'hello,world!'

 

p = Person()

p.textOut()

p.sayHello()

Person.sayHello()


另外需要注意的是很多以两个下划线开头和结尾的函数(专用方法),这些往往都有特殊用途,比如上面提到的 __init__ 和 __del__,还有 __add__, __eq__, __ge__, __gt__, __lt__, __le__, __ne__,__getitem__, __str__ 等等。比如 __getitem__ 用来实现 [] 操作,而 __str__ 用来实现 str() 操作,等等。



0.3.2  差异之二:入口方法

C#语言必须要有入口方法Main(),这是程序开始执行的地方。

Python语言中没有入口方法(函数),作为解释型的语言,Python代码会自动从头执行(所以在代码2中除了第8行,其它行均属于废话)。

如过你对这点不习惯,可以使用Python代码的内置属性__name__。__name__属性会根据Python代码的运行条件变化:当Python代码以单个文件运行时,__name__便等于"__main__",当你以模块形式导入使用Python代码时,__name__属性便是这个模块的名字。

当然,Python中的__name__属性并不是为了照顾C/C++/C#程序员的编程习惯而准备的,它主要目的是用于模块测试。想象一下在C#中编写一个组件或类代码时,一般还得同时编写一个调用程序来测试它。而Python中可以把二者合二为一,这就是__name__属性的真正作用。


例如以一个下划线开始的标识符(如 _foo)不能用from module import *语句导入。前后均有两个下划线的标识符,如__init__,被特殊方法保留。前边有两个下划线的标识符,如__bar,被用来实现类私有属性


1.2.1  空类型

空类型(None)表示该值是一个空对象,比如没有明确定义返回值的函数就返回None。空类型没有任何属性,经常被用做函数中可选参数的默认值。None的布尔值为假。


1.3.1.1 字符串类型

Python拥有两种字符串类型:标准字符串(str)是单字节字符序列,Unicode字符串(unicode)是双字节字符序列。

在Python中定义一个Unicode字符串,需要在引号前面加上一个字符u,例如

1 # -*-coding: utf-8 -*-
2  print u'我是派森'

唯一提一点就是在Python中提取一个字符串的子串时,记得用切片语句(后边讲列表和元组时还会介绍),而不要再去找SubString了,见下边的例子:

1 # -*-coding: utf-8 -*-
2  str1 =  u'我是派森'
3 print str1[2:4]
4  #输出 '派森'


1.3.1.2 列表(list)

Python中的列表(list)类似于C#中的可变数组(ArrayList),用于顺序存储结构。

列表用符号[]表示,中间的元素可以是任何类型(包括列表本身,以实现多维数组),元素之间用逗号分隔。取值或赋值的时候可以像C数组一样,按位置索引:

1 # -*-coding: utf-8 -*-
2  array = [1,2,3]
3  print array[0]
4  #输出 1
5 array[0] ='a'
6  print array
7  #输出 ['a', 2,3]

 

从上边的代码中你可能发现一个有趣的事情:在Python的列表中可以混合使用不同类型的数据,像['a', 2, 3]这样,不过我不建议你这样做,我觉得没什么好处(虽然个别场合下可能会比较方便)。


1.3.1.3 元组(tuple)

元组与列表非常相似,它是用()而不是[]括起来的序列。元组比列表的速度更快,但元组是一个不可变的序列,也就是与str一样,无法在原位改变它的值。除此之外,其他属性与列表基本一致。

元组定义的方法与列表类似,不过在定义只包含一个元素的元组时,注意在后边加一个逗号。请体会以下几句语句的差异:

 1# -*- coding: utf-8 -*-
 2 test =[0]        #列表可以这样定义
 3  print type(test)  #输出<type'list'>
 4  test = [0,]       #也可以这样定义
 5  print type(test)  #输出<type'list'>
 6  test = (0,)       #元组可以这样定义
 7  print type(test)  #输出<type'tuple'>
 8  test = (0)        #但不能这样定义,Python会认为它是一个括号表达式
 9  print type(test)  #输出<type'int'>
10  test = 0,         #也可以省略括号,但要注意与C的逗号表达式不同
11  print type(test)  #输出<type 'tuple'>



1.3.2  集合(set)

Python中的set和C#中的集合(collection)不是一个概念,这是翻译的问题。Python中的集合是指无序的、不重复的元素集,类似数学中的集合概念,可对其进行交、并、差、补等逻辑运算。

常见集合的语法为:s = set(['a', 'b', 'c'])。不过set在Python 3.0中发生了较大的变化,创建一个集合的语法变成了:s = {1,2,3},用花括弧的方法,与后边要提到的dict类似。

如果在set中传入重复元素,集合会自动将其合并。这个特性非常有用,比如去除列表里大量的重复元素,用set解决效率很高,示例如下:

1 # -*-coding: utf-8 -*-
2  a = [11,22,33,44,11,22,11,11,22,22,33,33,33]
3 b = set(a)
4  print b
5  #输出 set([33,11, 44, 22])

另一个例子,找出两个list里面相同的元素(集合求交,其它类推),代码如下:

1 # -*-coding: utf-8 -*-
2  a = ["11","22","33"]
3 b = ["11","33"]
4 c =set(a)&set(b)
5  print c
6  #输出set(['11', '33'])



使用==来比较两个对象是否相等,使用is判定两者是否等同(同一个对象)


三. 文件

import sys

text = sys.stdin.read()


f = open('a.txt', a)

for line in f:

     print line


三. python 的with语句

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

  • 上下文管理协议(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持该协议的对象要实现这两个方法。
  • 上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__() 和 __exit__() 方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。
  • 运行时上下文(runtime context):由上下文管理器创建,通过上下文管理器的 __enter__() 和__exit__() 方法实现,__enter__() 方法在语句体执行之前进入运行时上下文,__exit__() 在语句体执行完后从运行时上下文退出。with 语句支持运行时上下文这一概念。
  • 上下文表达式(Context Expression):with 语句中跟在关键字 with 之后的表达式,该表达式要返回一个上下文管理器对象。
  • 语句体(with-body):with 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 __enter__() 方法,执行完语句体之后会执行 __exit__() 方法


四. python 装饰器

       饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#-*- coding: UTF-8 -*-
import time
 
def foo():
    print 'in foo()'
 
# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法
def timeit(func):
     
    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    def wrapper():
        start= time.clock()
        func()
        end=time.clock()
        print 'used:', end - start
     
    # 将包装后的函数返回
    return wrapper
 
foo= timeit(foo)
foo()

上面这段代码看起来似乎已经不能再精简了,Python于是提供了一个语法糖来降低字符输入量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time
 
def timeit(func):
    def wrapper():
        start= time.clock()
        func()
        end=time.clock()
        print 'used:', end - start
    return wrapper
 
@timeit
def foo():
    print 'in foo()'
 
foo()
内置的装饰器有三个,分别是staticmethod、classmethod和property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性
0 0
原创粉丝点击