">

简明的Python教程之实例篇

摘要:Python作为一门简洁优美且功能强大的语言,越来越受编程人员的喜欢。在工业界和学术界也是非常受欢迎的编程语言。python语言可以跨平台跨应用开发。本系列文章首先介绍Python语言及其可以做什么事情。哪些人群适合学习python和python语法特点。其次介绍了Python进阶,以实际案例演示常用的语句和控制流、表达式、函数、数据结构、标准库等知识点。然后扩展介绍了python第三方库,使读者对python有个全面的理解和认识。最后一节,采用实际案例帮助读者综合运用python知识。 (本文原创,转载必须注明出处.)

语句和控制流

Hello World

编程第一步,打印“Hello World”的输入结果:

def callHello():
    print("hello world!")

callHello()

运行结果:

hello world!

if 语句::根据成绩评判等级

# if 语句:根据成绩评判等级
def CallLevel(score):
    if score >= 90 :
        print("优秀")
    elif score >= 60:
        print("及格")
    else:
        print("不及格")
CallLevel(score=60)
运行结果: 及格 ## for 语句:循环输出所有评分指标 # for 语句:循环输出所有评分指标 def GetLevel(score): for lev in score: print(lev,end=" ") # 设置不换行 GetLevel(score=["优秀","及格","不及格"]) # 列表参数 运行结果: 优秀 及格 不及格 ## while 语句:循环输出所有评分
# while 语句:循环输出所有评分
def GetLevel2(score):
    countlen=len(score)
    while countlen > 0:
        print(score[countlen-1],end=" ") # 设置不换行
        countlen -= 1

GetLevel2(score=[90,30,100,98,60])
运行结果: 60 98 100 30 90 > range() 函数:循环输出所有评分指标的下标
# range() 函数:循环输出所有评分指标的下标
def GetValue(score):
    for lev in range(len(score)):
        print(lev,end=" ")
GetValue(score=["优秀","及格","不及格"])
运行结果: 0 1 2 ## break 语句:统计优秀学生的个数
# break 语句:不及格的跳过
def GetHighLev(score):
    result=0
    for lev in score:
        if lev < 90:
            break
        else:
            result += 1
    print("成绩优秀的学生有:"+str(result)+"位。")

GetHighLev(score=[90,30,100,98,60])
运行结果: 成绩优秀的学生有:1位。 分析:实际优秀者个数是90,100,98共计3位,输出结果却是1位。造成这种结果的原因是,当循环输入列表90时候,满足条件自动加1.继续输入30,不满足条件,直接跳出整个程序,输出最后一条语句。 ## continue 语句:统计优秀成绩的个数
# continue 语句:统计优秀成绩的个数
def GetHighLev2(score):
    result=0
    for lev in score:
        if lev < 90:
            continue
        else:
            result += 1
    print("成绩优秀的学生有:"+str(result)+"位。")

GetHighLev2(score=[90,30,100,98,60])
运行结果: 成绩优秀的学生有:3位。 > pass 语句:什么也不做,占位符
# pass 语句:什么也不做,占位符
def callPass():
    pass
print(callPass())
运行结果: None *** # 函数 ## 定义函数:斐波那契数列
# 输出指定数的斐波那契数列
def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()
fib(100)
运行结果: 0 1 1 2 3 5 8 13 21 34 55 89 结果分析: 关键字 def 引入了一个函数定义。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。一个函数定义会在当前符号表内引入函数名。函数名指代的值(即函数体)有一个被 Python 解释器认定为用户自定义函数的类型。 ## 函数默认参数
# 函数默认参数
def sayhello(name="Tom"):
    print("Hello,"+name)

sayhello()
运行结果: Hello,Tom ## 关键字参数
# 关键字参数
def person(name, age, **kw):  #前两个是必须参数,最后一个可选可变参数
    print('name:', name, 'age:', age, 'other:', kw)

person("Tome",30) # 只调用必须参数
person("Tom",30,city="ChengDu",sex="man") # 自定义关键字参数
运行结果: name: Tome age: 30 other: {} name: Tom age: 30 other: {'sex': 'man', 'city': 'ChengDu'} ## 可变参数
# 可变参数
def concat(*args, sep="/"):
    print(sep.join(args))
concat('我','是','可变','参数')
运行结果: 我/是/可变/参数 ## Lambda 形式
# Lambda 形式
def Lambda(nums):
    nums.sort(key=lambda num: num[0])
    print(nums)

Lambda(nums = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')])
运行结果: [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] *** # List 列表 ## list常用方法
list.append(x)    添加元素到列表尾部。
list.extend(L)    列表合并。
list.insert(i, x) 在指定位置插入一个元素。
list.remove(x)    删除列表中值为 x 的第一个元素。
list.pop([i])     从列表的指定位置删除元素,并将其返回。
list.clear()      从列表中删除所有元素。相当于 del a[:]。
list.index(x)     返回列表中第一个值为 x 的元素的索引。
list.count(x)     返回 x 在列表中出现的次数。
list.sort()       对列表中的元素就地进行排序。
list.reverse()    就地倒排列表中的元素。
list.copy()       返回列表的一个浅拷贝。等同于 a[:]。

列表的切分

# 列表的切分
def calllist(names):
    print(names[-1:]) # 输出列表最后一个值
    print(names[:3])  # 输出列表前3个值
calllist(names=['this','is','a','list'])

运行结果:

['list'] 
['this', 'is', 'a']

List :列表作堆栈(先进先出)

# 把列表当作堆栈使用
def SomeList(stack):
    print("原始列表(栈):",end=' ')
    print(stack)
    stack.append('贺知章')
    stack.append('杜牧')
    print("追加后列表(栈):",end=' ')
    print(stack)
    stack.pop()
    stack.pop()
    print("出栈后的数据:",end=' ')
    print(stack)

SomeList(stack=['李白','杜甫', '白居易'])

运行结果:(先进先出)

原始列表(栈): ['李白', '杜甫', '白居易']
追加后列表(栈): ['李白', '杜甫', '白居易', '贺知章', '杜牧']
出栈后的数据: ['李白', '杜甫', '白居易']

List :列表作队列(先进后出)

# 把列表当作队列使用:使用队列时调用collections.deque,它为在首尾两端快速插入和删除而设计。
from collections import deque
def SomeList2(queue):
    print("原始列表:",end=' ')
    print(queue)
    queue.append("李商隐")
    queue.append("杜牧")
    print("入队的列表:",end=' ')
    print(queue)
    queue.popleft()
    queue.popleft()
    print("出队后列表:",end=' ')
    print(queue)

SomeList2(queue = deque(['李白','杜甫', '白居易']))

运行结果:(先进后出)

原始列表: deque(['李白', '杜甫', '白居易'])
入队的列表: deque(['李白', '杜甫', '白居易', '李商隐', '杜牧'])
出队后列表: deque(['白居易', '李商隐', '杜牧'])

列表推导式

# 列表推导式
def callList(nums):
    squares = [n**2 for n in nums]
    print(squares)
callList(nums=[2,4,6,8])

运行结果:

[4, 16, 36, 64]

列表的矩阵转秩

# 矩阵转秩
def countList(matrix):
    result = [[row[i] for row in matrix] for i in range(4)]
    print(result)

matrix = [
     [1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
]
countList(matrix)

运行结果:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

元组/集合/字典

虽然元组和列表很类似,它们经常被用来在不同的情况和不同的用途。元组有很多用途。例如 (x, y) 坐标对,数据库中的员工记录等等。元组就像字符串, 不可变的。列表是可变的 ,它们的元素通常是相同类型的并通过迭代访问。

操作元组

def calltuple(tuples):
    for t in tuples:
        print(t+"\t",end=" ")
    print()
calltuple(tuples=('百度','阿里巴巴','腾讯')) # 元组参数

运行结果:

百度     阿里巴巴     腾讯    

set集合

集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。

def callset(basket):
    result= set(basket)
    print(result)

callset(basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'})

运行结果:

{'pear', 'orange', 'apple', 'banana'}

字典

理解字典的最佳方式是把它看做无序的键:值对(key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典: {} 。初始化列表时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。

def calldict(dicts):
    print("原始字典",end=' ')
    print(dicts)   # 原始字典
    dicts['欧阳修'] = '宋朝' # 追加字典
    print("追加后的字典",end=' ')
    print(dicts)    # 追加后的字典
    print("字典键的集合",end=' ')
    print(list(dicts.keys())) # 字典键的集合
    print("字典键的排序",end=' ')
    print(sorted(dicts.keys())) # 字典键的排序
    print("字典值的集合",end=' ')
    print(list(dicts.values())) # 字典值的集合

calldict(dicts = {'李白': '唐朝', '杜甫': '唐朝'})

运行结果:

原始字典 {'杜甫': '唐朝', '李白': '唐朝'}
追加后的字典 {'杜甫': '唐朝', '李白': '唐朝', '欧阳修': '宋朝'}
字典键的集合 ['杜甫', '李白', '欧阳修']
字典键的排序 ['李白', '杜甫', '欧阳修']
字典值的集合 ['唐朝', '唐朝', '宋朝']

面向对象编程:类

通过案例理解python中的类:父类是动物类,有初始化函数,且有动物讲话的方法,子类是一个狗类,继承父类所有属性,并扩展自己方法,调用子类讲话方法,并直接调用父类讲话方法。

"""
# 欢迎进入我的主页:http://www.cnblogs.com/baiboy/.
"""
class BaseAnimal: # 父类:动物
    def __init__(self,name,age): # 初始化方法:括号里是形参
        self.name=name
        self.age=age
    def speak(self): # 父类的行为方法
        print("我的名字是[ %s ],今年[ %d ]岁" %(self.name,self.age))


class SubDog(BaseAnimal): # 子类:小狗
    def __init__(self,name,age,say): # 初始化方法:括号里是形参
        BaseAnimal.__init__(self,name,age)
        self.say=say
        print("这是子类[ %s ]."%(self.name))
        print('_'*20+'调用子函数方法'+'_'*20)
    def talk(self):      # 子类的行为方法
        # BaseAnimal.speak(self) # 调用父类的行为方法
        print("我的名字是[ %s ],今年[ %d ]岁,我想说: %s" %(self.name,self.age,self.say))


ani=SubDog('dog',12,'汪汪...')
print(ani.talk())
print('_'*20+'直接调用父函数方法'+'_'*20)
BaseAnimal('tom',13).speak()

运行结果:

这是子类[ dog ].

____________________调用子函数方法____________________

我的名字是[ dog ],今年[ 12 ]岁,我想说: 汪汪...

____________________直接调用父函数方法____________________

我的名字是[ tom ],今年[ 13 ]岁

解析: init 方法(双下划线): init 方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象初始化。
注意,这个名称的开始和结尾都是双下划线。我们把init方法定义为取一个参数name(以及普通的参数self)。在 init 方法里,我们只是创建一个新的域,也称为name。注意:它们是两个不同的变量,尽管它们有相同的名字。点号使我们能够区分它们。最重要的是,在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给 init 方法。这是这种方法的重要之处。现在,我们能够在我们的方法中使用self.name域。给C++/Java/C#程序员的注释 init 方法类似于C++、C#和Java中的constructor 。


标准库

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。
Python标准库的主要功能有:

  1. 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
  2. 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
  3. 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、日志(logging)等功能
  4. 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
  5. 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
  6. W3C格式支持,包含HTML,SGML,XML的处理。
  7. 其它功能,包括国际化支持、数学运算、HASH、Tkinter等

Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能覆盖科学计算、Web开发、数据库接口、图形系统多个领域。第三方模块可以使用Python或者C语言编写。SWIG,SIP常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries包含了一组库,Boost.Python,使得以Python或C++编写的程序能互相调用。Python常被用做其他语言与工具之间的“胶水”语言。


Python第三方库

Web框架库

  • Django: 开源Web开发框架,它鼓励快速开发,并遵循MVC设计,开发周期短。
  • Flask: 轻量级的Web框架。
  • Pyramid: 轻量,同时有可以规模化的Web框架,Pylon projects 的一部分。
  • ActiveGrid: 企业级的Web2.0解决方案。
  • Karrigell: 简单的Web框架,自身包含了Web服务,py脚本引擎和纯python的数据库PyDBLite。
  • Tornado: 一个轻量级的Web框架,内置非阻塞式服务器,而且速度相当快
  • webpy: 一个小巧灵活的Web框架,虽然简单但是功能强大。
  • CherryPy: 基于Python的Web应用程序开发框架。
  • Pylons: 基于Python的一个极其高效和可靠的Web开发框架。
  • Zope: 开源的Web应用服务器。
  • TurboGears: 基于Python的MVC风格的Web应用程序框架。
  • Twisted: 流行的网络编程库,大型Web框架。
  • Quixote: Web开发框架。

    科学计算库

  • Matplotlib: 用Python实现的类matlab的第三方库,用以绘制一些高质量的数学二维图形。
  • Pandas: 用于数据分析、数据建模、数据可视化的第三方库。
  • SciPy: 基于Python的matlab实现,旨在实现matlab的所有功能。
  • NumPy: 基于Python的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案。

    GUI库

  • PyGtk: 基于Python的GUI程序开发GTK+库。
  • PyQt: 用于Python的QT开发库。
  • WxPython: Python下的GUI编程框架,与MFC的架构相似。

    其他库

  • BeautifulSoup: 基于Python的HTML/XML解析器,简单易用。
  • gevent: python的一个高性能并发框架,使用了epoll事件监听、协程等机制将异步调用封装为同步调用。
  • PIL: 基于Python的图像处理库,功能强大,对图形文件的格式支持广泛。目前已无维护,另一个第三方库Pillow实现了对PIL库的支持和维护。
  • PyGame: 基于Python的多媒体开发和游戏软件开发模块。
  • Py2exe: 将python脚本转换为windows上可以独立运行的可执行程序。
  • Requests: 适合于人类使用的HTTP库,封装了许多繁琐的HTTP功能,极大地简化了HTTP请求所需要的代码量。
  • scikit-learn: 机器学习第三方库,实现许多知名的机器学习算法。
  • TensorFlow: Google开发维护的开源机器学习库。
  • Keras: 基于TensorFlow,Theano与CNTK的高级神经网络API。
  • SQLAlchemy: 关系型数据库的对象关系映射(ORM)工具

参考文献

  1. Python官网
  2. 中文维基百科
  3. GitHub
  4. 图书:《机器学习实战》
  5. 图书:《自然语言处理理论与实战》

完整代码下载

源码请进【机器学习和自然语言QQ群:436303759】文件下载:自然语言处理和机器学习技术QQ交流

作者声明

本文版权归作者所有,旨在技术交流使用。未经作者同意禁止转载,转载后需在文章页面明显位置给出原文连接,否则相关责任自行承担。

白宁超 wechat
扫一扫关注微信公众号,机器学习和自然语言处理,订阅号datathinks!