摘要: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标准库的主要功能有:
- 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
- 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
- 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、日志(logging)等功能
- 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
- 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
- W3C格式支持,包含HTML,SGML,XML的处理。
- 其它功能,包括国际化支持、数学运算、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)工具
参考文献
- Python官网
- 中文维基百科
- GitHub
- 图书:《机器学习实战》
- 图书:《自然语言处理理论与实战》
完整代码下载
作者声明
本文版权归作者所有,旨在技术交流使用。未经作者同意禁止转载,转载后需在文章页面明显位置给出原文连接,否则相关责任自行承担。