Python基础
python简介
-
Python是一门解释型(或脚本型)的高级编程语言(直接运行,不需要编译,依靠解释器),由“龟叔”在1989年推出
-
具有非常丰富的第三方库,通过它们可以快速实现我们想要的功能,而无需重复“造轮子”
-
Python俗称胶水语言,它可以调用其它语言编写的功能模块(尤其是C/C++),以弥补自身不足
-
Python语言的开发效率非常高,但用Python语言编写的程序运行效率却很低
-
Python的哲学:简单、优雅、明确
-
人生苦短,我用Python!
Python语法
-
Python源文件的后缀名为py
-
输出数据调用内置函数print,输入数据调用内置函数input
-
单行注释使用#,没有提供专门的多行注释语法(有变通的做法,且看下文!)
-
语句末尾不建议书写分号,除非是想在一行上编写多条语句
常用数据类型
int:整数,比如123 ,b1101,o123,0xdf等
float:浮点数,比如-10.24,3.2e-2等
bool:布尔类型,只有两个值,即True和False
str:字符串,采用Unicode统一编码,用单引号、双引号和三引号括起来的数据,三引号非常适合表示多行字符串,在这三种写法前面都可以加上r前缀,表示原始字符串,即内部的内容全部按照字面解释,转义无效
bytes:字节,以字节为单位表示的数据,用于网络传输或文件存储,比如b’abc\x3f\xa4‘
tuple:元组,用小括号将多个数据括起来,不可变对象,即一旦创建就无法改变它
list:列表,用中括号将多个数据括起来,可变对象
dict:字典,用花括号将若干个键值对数据括起来,可变对象,具有极快的检索和插入速度
set:集合用花括号将若干个数据括起来,无序并不能重复
None:空类型,只有一个值:None
变量(Variable)
- Python是弱类型编程语言,变量无需先声明数据类型,直接对变量名赋值就相当于定义了一个变量,并且变量数据类型是动态的,而不是固定不定的
- 变量命名规则:由英文字母、数字或下划线构成,不能以数字开头,并且不能为关键字(比如int,float,for等)
常量(Constant)
Python并没有提供定义常量的语法规则,按照约定俗成的习惯做法,我们通常使用全大写字母表示变量代替常量
运算符(Operator)
实现各种运算功能的特殊符号,按功能有以下常用分类:
- 算数运算符:+,-,*,**,/,//(floor divide,地板除),%
- 比较运算符:>,>=,<,<=,==,!=
- 逻辑运算符:not,and,or
- 位运算符:&,|,~,^
- 赋值运算符:=,+=,-=,*=等
- 成员运算符:in
流程控制结构
- 顺序结构(从上往下逐行执行代码,最基础的结构)
- 选择结构(满足某个条件才执行若干行代码)
- 循环结构(将若干行代码重复执行多次)
项目实战
- 二维码生成器
import os
import wx
try:
import qrcode
except ImportError:
qrcode = None
try:
import PyQRNative
except ImportError:
PyQRNative = None ########################################################################
class QRPanel(wx.Panel):
"""""" #----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
self.photo_max_size = 240
sp = wx.StandardPaths.Get()
self.defaultLocation = sp.GetDocumentsDir()
img = wx.EmptyImage(240,240)
self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY, wx.BitmapFromImage(img))
qrDataLbl = wx.StaticText(self, label="Text to turn into QR Code:")
self.qrDataTxt = wx.TextCtrl(self, value="http://www.mousevspython.com", size=(200,-1))
instructions = "Name QR image file"
instructLbl = wx.StaticText(self, label=instructions)
self.qrPhotoTxt = wx.TextCtrl(self, size=(200,-1))
browseBtn = wx.Button(self, label='Change Save Location')
browseBtn.Bind(wx.EVT_BUTTON, self.onBrowse)
defLbl = "Default save location: " + self.defaultLocation
self.defaultLocationLbl = wx.StaticText(self, label=defLbl)
qrcodeBtn = wx.Button(self, label="Create QR with qrcode")
qrcodeBtn.Bind(wx.EVT_BUTTON, self.onUseQrcode)
pyQRNativeBtn = wx.Button(self, label="Create QR with PyQRNative")
pyQRNativeBtn.Bind(wx.EVT_BUTTON, self.onUsePyQR)
# Create sizer
self.mainSizer = wx.BoxSizer(wx.VERTICAL)
qrDataSizer = wx.BoxSizer(wx.HORIZONTAL)
locationSizer = wx.BoxSizer(wx.HORIZONTAL)
qrBtnSizer = wx.BoxSizer(wx.VERTICAL)
qrDataSizer.Add(qrDataLbl, 0, wx.ALL, 5)
qrDataSizer.Add(self.qrDataTxt, 1, wx.ALL|wx.EXPAND, 5)
self.mainSizer.Add(wx.StaticLine(self, wx.ID_ANY), 0, wx.ALL|wx.EXPAND, 5)
self.mainSizer.Add(qrDataSizer, 0, wx.EXPAND)
self.mainSizer.Add(self.imageCtrl, 0, wx.ALL, 5)
locationSizer.Add(instructLbl, 0, wx.ALL, 5)
locationSizer.Add(self.qrPhotoTxt, 0, wx.ALL, 5)
locationSizer.Add(browseBtn, 0, wx.ALL, 5)
self.mainSizer.Add(locationSizer, 0, wx.ALL, 5)
self.mainSizer.Add(self.defaultLocationLbl, 0, wx.ALL, 5)
qrBtnSizer.Add(qrcodeBtn, 0, wx.ALL, 5)
qrBtnSizer.Add(pyQRNativeBtn, 0, wx.ALL, 5)
self.mainSizer.Add(qrBtnSizer, 0, wx.ALL|wx.CENTER, 10)
self.SetSizer(self.mainSizer) self.Layout()
#----------------------------------------------------------------------
def onBrowse(self, event):
""""""
dlg = wx.DirDialog(self, "Choose a directory:", style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
self.defaultLocation = path
self.defaultLocationLbl.SetLabel("Save location: %s" % path) dlg.Destroy()
#----------------------------------------------------------------------
def onUseQrcode(self, event):
"""
https://github.com/lincolnloop/python-qrcode
"""
qr = qrcode.QRCode(version=1, box_size=10, border=4)
qr.add_data(self.qrDataTxt.GetValue())
qr.make(fit=True) x = qr.make_image()
qr_file = os.path.join(self.defaultLocation, self.qrPhotoTxt.GetValue() + ".jpg")
img_file = open(qr_file, 'wb')
x.save(img_file, 'JPEG')
img_file.close()
self.showQRCode(qr_file)
#----------------------------------------------------------------------
def onUsePyQR(self, event):
"""
http://code.google.com/p/pyqrnative/
"""
qr = PyQRNative.QRCode(20, PyQRNative.QRErrorCorrectLevel.L)
qr.addData(self.qrDataTxt.GetValue())
qr.make()
im = qr.makeImage()
qr_file = os.path.join(self.defaultLocation, self.qrPhotoTxt.GetValue() + ".jpg")
img_file = open(qr_file, 'wb')
im.save(img_file, 'JPEG')
img_file.close()
self.showQRCode(qr_file)
#----------------------------------------------------------------------
def showQRCode(self, filepath):
"""
"""
img = wx.Image(filepath, wx.BITMAP_TYPE_ANY)
# scale the image, preserving the aspect ratio
W = img.GetWidth()
H = img.GetHeight()
if W > H:
NewW = self.photo_max_size
NewH = self.photo_max_size * H / W
else:
NewH = self.photo_max_size
NewW = self.photo_max_size * W / H
img = img.Scale(NewW,NewH)
self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))
self.Refresh() ########################################################################
class QRFrame(wx.Frame):
"""
"""
#----------------------------------------------------------------------
def __init__(self):
"""
Constructor
"""
wx.Frame.__init__(self, None, title="QR Code Viewer", size=(550,500)) panel = QRPanel(self)
if __name__ == "__main__":
app = wx.App(False)
frame = QRFrame()
frame.Show()
app.MainLoop()
第三方库使用方法
- 根据库的名字下载安装(使用pip包管理器),比如pip install qrcode;
- 在Python程序代码中引入它;
- 调用它提供的函数或类实现我们想要的功能
扩展知识
二维码:Quick Response Code ,快速响应码,它就是将一个数据表示为两种不同颜色的小方格构成的二维平面图案
作业
- 按照笔记,自己巩固Python基础;
- 优化二维码生成器,让它适合其他人使用,并分享给其他人使用
pyinstaller
将Python脚本打包为exe可执行文件,以方便部署在其他电脑上运行,常用用法:
pyinstaller -F -i 图标路径 Python原文件路径
(参数说明:-F表示生成单个可执行文件,-i表示设置可执行文件图标,-w表示不显示控制台窗口)
pip包管理器常用用法
pip install 包名 #安装指定的第三方包(从国外官方服务器上下载)
pip install 包名 -i https://pypi.douban.com/simple # 安装指定的第三方包(从国内豆瓣镜像服务器上下载)
pip unstall 包名 # 卸载某个包
pip list #显示所有已经安装的包
模块和包
模块(Module):就是一个Python源文件,模块可以被直接运行,还可以被其他模块调用
包(Package):就是一个文件夹用来存放若干个模块,解决模块命名冲突问题,为了和普通文件夹分开来,规范的做法是在包下面创建一个_ _ init _ _.py文件
切片(Slice)
用于获取str,bytes,list,tuple等序列类型数据中的部分内容
函数(Function)
实现某个功能的小功能模块,用def关键字定义,分为自定义函数和内置函数(Built-in Function)
函数参数的多种情况:
- 位置参数
- 默认参数
- 可变参数
- 命令关键字参数
- 关键字参数
面对对象编程(OOP)
- 三大特性:封装、继承、多态
- object是根类,其他所有类都是它的直接或间接子类
- 特殊方法 _ _ init _ _ 用于对实例属性进行初始化
- 实例属性和类属性
- 鸭子类型,比如file like object