有过语言基础不多介绍,反正Python和Java,C++等一样,是一门计算机语言。Python的特色体现在简洁易读,比较接近语言习惯,如 print('Hello World')直接明了解释为打印Hello World。Python还广泛地用于数据采集(爬虫等),这也是作者学习Python的第一理由。
本篇博客学习开发环境和基础语法,并在本篇结束后实现一个小例子。
- Windows下Python开发环境搭建
- 安装Python3
Python是一种面向对象的解释型计算机程序设计语言,所以运行Python需要编译器和解释器。和其他解释型语言一样,我们需要下载Python安装包。官网地址:https://www.python.org/。这个安装包分2.x和3.x版本,我们选用最新的3.7来做开发。具体步骤:在download下选择Windows,在下载页面里选择你想要的Python版本下载。如3.7.4(下图),选择executable installer下载为exe,运行安装后可自动设置环境变量。
- 安装Anaconda
另外,为了方便Python包管理和更新,我们也下载一个管理软件Anaconda(Anaconda里面包含了conda、Python等180多个科学包及其依赖项)。我是原先有3.6版本需要更新,当然你也可以直接在Anaconda里下载配置Python3.7,这样相关关联包也能保持一致。Anaconda下载地址:https://www.anaconda.com/distribution/。选择Anaconda 3版本,根据提示下载并安装。安装完成后在命令行输入 conda --version ,显示版本号即表示安装并配置环境变量成功。我的是conda 4.7.12。
Anaconda可以创建虚拟环境提供Python开发,像我需要增加python3.7的开发环境,可以这样操作:输入以下命令
conda create -n learn python=3.7
activate learn
上面的截图为命令运行部分截图,可以看见安装了pip、sqlite、python3.7等包。
activate learn表示激活该环境。
以下为Anaconda常用命令
conda create -n learn python=3 // 创建一个名为learn的环境并指定python版本为3(的最新版本)
conda remove -n learn --all // 删除learn环境及下属所有包
conda env list //显示Anaconda下所有环境
activate 环境名 //激活(切换)环境
conda list // 列出当前环境的所有包
conda install 包名 //安装第三方包 如conda install requests
conda remove 包名 //卸载第三方包 如conda remove requests
conda update 包名 //更新requests包 如conda update requests
- Pycharm 安装
Pycharm 是目前 Python 语言最好用的集成开发工具。它有社区版和专业版(收费),我们选择社区版来进行基础开发。官网下载地址:https://www.jetbrains.com/pycharm/download/#section=windows 。按提示安装,插件页可以只选择MarkDown 来install,然后启动。
Pycharm中就可以配置上文的Anaconda环境。选择settings——Project —— Project Interpreter。在右侧Project Interpreter条目里点击设置按钮,下拉选择Add,弹出 Add Project Interpreter窗口。如下图:
Virtualenv Environment:在New enviroment里选择 Base Interpreter为刚刚上一步建立的learn环境,路径为Anaconda路径下env文件夹。如D:\software\anaconda\envs\learn\python.exe,这就表示绑定了learn虚拟环境来开发。
*勾选Inherit global site-packages可以使用base interpreter中的第三方库,不选将和外界完全隔离;
*勾选Make available to all projects可将此虚拟环境提供给其他项目使用。选择勾选上,使得新建项目不必在重新下载第三方包,可以根据实际情况选择。
Conda Environment:选择Existing environment 指定Interpreter为learn目录下python.exe。
- 完成
直到完成这里,我们才算是配置好了一套新的python3.7的开发环境。
2. Python 语法基础
语法的部分可以参考菜鸟教程或其他基础教程学习,这里简单记录下。
- 数据类型和变量
Python 中的变量赋值不需要类型声明,且在使用前都必须赋值,变量赋值以后该变量才会被在内存中创建。等号(=)用来给变量赋值。
基本数据类型分为数字、字符串str、列表list、字典dict、元祖tuple、集合set、布尔值。数据类型又可分为可变数据类型和不可变数据类型。
可变数据类型:在id不变的情况下,值value可以发生改变,如列表、字典、元祖、集合
不可变数据类型:值value改变时id也会发生改变,如数字、字符串、布尔
上一段代码
# 数字类型 分为整型int和浮点型float
a = 1 # int型赋值
b = c = 1 # b=1,c=1 同步赋值
e, f = 2, 3 # e=2,f=3 分开赋值
weight = 65.5 # float类型
print(a, b, c, e, f, weight)
# 字符串类型
msg1 = 'Hello'
msg2 = 'World'
msg3 = msg1 + ' ' + msg2
print(msg3) # 打印
name = input("What is your name?") # 输入
print('Hello', name)
#布尔值:布尔值只有两种——True和False,布尔值的作用就是用来判断。
ok = True
print(ok)
# 列表list: 包含在[ ]内,内部的元素可以是字符串、数字、列表、元祖、集合、字典,各自以逗号隔开
list1 = [3, 2, 1, 'hello']
list1.append('world') # 增加元素 输出为[3,2,1,'hello','world']
list1.remove(3) # 删除元素 输出为[2,1,'hello','world']
del list1[2] # 删除元素 [1,'hello','world']
list1[0] = 8 # 修改元素的值,索引从0开始 [8,'hello','world']
print(list1)
# 字典dict:定义在{ }内,逗号分割,每一个元素的形式都是key:value 无序
dic1 = {'name': 'jack', 'country': 'china', 'age': 17, 'hobby': ['girls', 'money', 'delicious food']}
dic1['sex'] = 'male' # 增加字典元素
del dic1['country'] # 删除字典元素
dic1['age'] = 18 # 赋值
print(dic1)
#元祖tuple:可以存放多个值。元祖是不可变类型,写法与列表相似,只是将[ ] 改为( )
t=(1,[1,3],'sss',(1,2)) #t=tuple((1,[1,3],'sss',(1,2)))
print(type(t))
还有一个重要类型是集合Set ,Set是一个无序且不重复的元素集合,用逗号分隔,元素必须是不可变对象。这里也附一个Set方法大全
方法名 | 语法格式 | 说明 | 举例 |
add() | set1.add() | 向 set1 集合中添加数字、字符串、元组或者布尔类型 | >>> set1 = {1,2,3} >>> set1.add((1,2)) >>> set1 {(1, 2), 1, 2, 3} |
clear() | set1.clear() | 清空 set1 集合中所有元素 | >>> set1 = {1,2,3} >>> set1.clear() >>> set1 set() set()才表示空集合,{}表示的是空字典 |
copy() | set2 = set1.copy() | 拷贝 set1 集合给 set2 | >>> set1 = {1,2,3} >>> set2 = set1.copy() >>> set1.add(4) >>> set1 {1, 2, 3, 4} >>> set1 {1, 2, 3} |
difference() | set3 = set1.difference(set2) | 将 set1 中有而 set2 没有的元素给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.difference(set2) >>> set3 {1, 2} |
difference_update() | set1.difference_update(set2) | 从 set1 中删除与 set2 相同的元素 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.difference_update(set2) >>> set1 {1, 2} |
discard() | set1.discard(elem) | 删除 set1 中的 elem 元素 | >>> set1 = {1,2,3} >>> set1.discard(2) >>> set1 {1, 3} >>> set1.discard(4) {1, 3} |
intersection() | set3 = set1.intersection(set2) | 取 set1 和 set2 的交集给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.intersection(set2) >>> set3 {3} |
intersection_update() | set1.intersection_update(set2) | 取 set1和 set2 的交集,并更新给 set1 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.intersection_update(set2) >>> set1 {3} |
isdisjoint() | set1.isdisjoint(set2) | 判断 set1 和 set2 是否没有交集,有交集返回 False;没有交集返回 True | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.isdisjoint(set2) False |
issubset() | set1.issubset(set2) | 判断 set1 是否是 set2 的子集 | >>> set1 = {1,2,3} >>> set2 = {1,2} >>> set1.issubset(set2) False |
issuperset() | set1.issuperset(set2) | 判断 set2 是否是 set1 的子集 | >>> set1 = {1,2,3} >>> set2 = {1,2} >>> set1.issuperset(set2) True |
pop() | a = set1.pop() | 取出 set1 中一个元素,并赋值给 a | >>> set1 = {1,2,3} >>> a = set1.pop() >>> set1 {2,3} >>> a 1 |
remove() | set1.remove(elem) | 移除 set1 中的 elem 元素 | >>> set1 = {1,2,3} >>> set1.remove(2) >>> set1 {1, 3} >>> set1.remove(4) 会报错 集合里没有4这个对象 |
symmetric_difference() | set3 = set1.symmetric_difference(set2) | 取 set1 和 set2 中互不相同的元素,给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3 = set1.symmetric_difference(set2) >>> set3 {1, 2, 4} |
symmetric_difference_update() | set1.symmetric_difference_update(set2) | 取 set1 和 set2 中互不相同的元素,并更新给 set1 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set1.symmetric_difference_update(set2) >>> set1 {1, 2, 4} |
union() | set3 = set1.union(set2) | 取 set1 和 set2 的并集,赋给 set3 | >>> set1 = {1,2,3} >>> set2 = {3,4} >>> set3=set1.union(set2) >>> set3 {1, 2, 3, 4} |
update() | set1.update(elem) | 添加列表或集合中的元素到 set1 | >>> set1 = {1,2,3} >>> set1.update([3,4]) >>> set1 {1,2,3,4} |
- 运算符及字符串内置方法
算术运算符
+、-、*、/、%和其他语言一样使用。
**表示次幂 如a**b表示a的b次方。
//表示取整除 如9.0/4.0 = 4.0
比较运算符:返回True或False
== 比较对象是否相等
!=(<>) 比较对象是否不相等
> 、>=、<、<= 大于..大于等于..小于..小于等于
赋值运算
=、+=、-=、*=、/=、%=、**=、//= 都是计算后赋值
逻辑运算
and、or、not 与或非
成员运算
in 、not in 包含、不包含
身份运算
is、is not 是不是引自一个对象
字符串内置方法 s='ab'
方法名 | 语法格式 | 说明 | 举例 |
strip() | s.strip() | 移除空白strip | |
lower() | s.lower() | 返回字符串小写格式 | |
upper() | s.upper() | 返回字符串大写格式 | |
capitalize() | s.capitalize() | 返回字符串首字母大写,其他字母全部小写的新字符串 | |
isspace() | s.isspace() | 判断字符串是否是空白(空格、制表符、换行符等)字符(没有任何字符 不算是空白) | >>> print(' '.isspace()) >>> print(s.isspace()) |
center() | s.center(width, fillchar]) | 将字符串居中,左右两边使用fillchar进行填充,,使得整个字符串 的长度为width,fillchar默认为空格。如果width小于字符串的长度, 则无法填充直接返回字符串本身(不会创建新字符串对象)。 | >>> print('ab'.center(4,'_')) _ab_ >>> print('ab'.center(5,'_')) __ab_ |
ljust() | s.ljust(width[, fillchar]) | 使用fillchar填充在字符串S的右边,使得整体长度为width | |
rjust() | s.rjust(width[, fillchar]) | 使用fillchar填充在字符串S的左边,使得整体长度为width | >>> print(s.ljust(5,'_')) ab___ >>> print(s.rjust(5,'_')) ___ab |
zfill() | s.zfill(width) | 用0填充在字符串S的左边使其长度为width | >>> print(s.zfill(5)) 000ab |
count() | s.count(c, start, end) | 返回字符串S中子串c出现的次数 可以指定从哪里开始计算(start)以及计算到哪里结束(end) | >>> print(s.count('a')) 1 |
endswith() startswith() | s.endswith(c, start, end) s.startswith(c, start, end) | 检查字符串S是否以c结尾/开始(或元祖中一个), 返回布尔值的True和False | >>> print(s.endswith('b')) True >>> print('abcxyz'.endswith(('ab','xyz'))) True |
find() rfind() | s.find(c, start, end) s.rfind(c, start, end) | 搜索字符串S中是否包含子串c,如果包含, 则返回sub的索引位置,否则返回"-1" rfind表示最右边的索引 | >>> print('abcxyzXY'.find('xy')) 3 >>> print('abcxyzXY'.find('Xy')) -1 |
index() rindex() | s.index(sub, start, end) s.rindex(sub, start, end) | index()和find()一样,唯一不同点在于当找不到子串时, 抛出 | |
replace() | s.replace(old, new, count) | 将字符串中的子串old替换为new字符串 如果给定count,则表示只替换前count个old子串 找不到old则返回原字符串 | >>> print('abcxyzoxy'.replace('xy','XY')) abcXYzoXY >>> print('abcxyzoxy'.replace('xy','XY',1)) abcXYzoxy |
还有strip()移除、join连接、split()分割、len()长度等,详细可查阅官方文档https://docs.python.org/3/library/stdtypes.html#string-methods
- 条件控制及循环控制
这里先先了解Python的缩进原则:
顶级代码必须顶行写,即如果一行代码本身不依赖于任何条件,那它必须不能进行任何缩进
同一级别的代码,缩进必须一致
官方建议缩进用4个空格(一般在开发工具里会自动排版)
上一段代码:
# 条件控制
score = input('>>: ')
score = int(score)
if score >= 90: # 可以使用or和and叠加条件 如score >= 90 and score<=100
print('A')
elif score >= 80:
print('B')
elif score >= 70:
print('C')
elif score >= 60:
print('D')
else:
print('E')
# while循环
count = 0
while count < 10:
print(count)
count += 1
if count == 5:
break; # break:跳出本层循环 continue:跳出本次循环
# while True: #死循环
# print('ok')
# while 1: #死循环
# print('ok')
# for循环
info_dic = {'name': 'jack', 'age': 18, 'number': '13567884563'}
albums = ('Poe', 'Gaudi', 'Freud', 'Poe2')
years = (1976, 1987, 1990, 2003)
msg1 = 'hello'
line, row = 2, 3
for row in range(1, 10):
# print默认end='\n',即会自动回车,这里设置end=' '就不会自动换行了
print('%s*%s=%s' % (line, row, line * row), end=' ') # 占位符:%s(可以为字符串占也可以为数字),%d(只能作为数字的占位符)
for k in info_dic: # 循环取字典的key
print(k)
for k in info_dic.values(): # 循环取字典的value
print(k)
for i in range(len(msg1)): # range是范围,即当i在msg1的长度范围以内时执行以下代码
print(i, msg1[i]) # 输出的是元素的位置序数和元素
for album in sorted(albums): # sorted:排序
print(album)
for album in reversed(albums): # reversed:翻转
print(album)
- 文件处理
后面谈到网络下载会再讲述这个,这里简单写个代码新建并读取文件
# 文件处理
#r ,只读模式:默认模式,文件必须存在,不存在则抛出异常
# w,只写模式:不可读,不存在则创建,存在则清空内容
#"b"表示以字节的方式操作 如wb表示写入字节
f=open('new.txt','w',encoding='utf-8')
f.write('1111111\n')
f.writelines(['22222\n','3333\n','444444\n'])
f.close()
f = open('new.txt', 'r', encoding='utf-8')
print(f.read())
print(f.readlines())
f.close()
#输出结果
#1111111
#22222
#3333
#444444
#[]