笔记基于微软官方python教程,B站视频地址
相关代码及资料,Github地址
本文适用于具有C/C++基础的朋友快速了解python
1 基础
1.1 字符串
1.1.1 赋值
name='edson'
在python
中,单引号和双引号正常情况下没有区别,但是最好统一使用一种格式
1.1.2 拼接
first_name='Edson'
last_name='Macleod'
print('Hello '+first_name+' '+last_name)
结果为:
Hello Edson Macleod
1.1.3 特定格式
s='the dog is named Pink'
print(s.upper()) #全部大写
print(s.lower()) #全部小写
print(s.capitalize()) #仅句首大写
print(s.count('i')) #统计特定字符出现次数
输出为:
THE DOG IS NAMED PINK
the dog is named pink
The dog is named pink
2
1.1.4 简化拼接
原拼接形式:
output='Hello, '+first_name+' '+last_name
用占位符简化后的形式:
output='Hello, {} {}'.format(first_name,last_name)
output='Hello, {0} {1}'.format(first_name,last_name)
#Only avaliable in Python3
output=f'Hello, {first_name} {last_name}'
以上输出结果一致
1.1.5 数据类型转换
将一数字与一字符串用+
拼接输出是有歧义的,结果会报错。
如果目的是将数字以字符串形式输出,那就需要用到转换函数
例如:
days_in_feb=28
print(str(days_in_feb)+' days in February')
利用str()
将数字转换为字符串
输出结果为:
28 days in February
特别地
如果是让用户输入两个数字再输出,例如:
a=input('pls input first num')
b=input('pls input second num')
print(a+b)
默认会以字符串类型处理
5 6
56
于是在输出的时候必须改为:
print(int(a)+int(b)) #也可以是float等其他类型
才能得到数字计算结果
1.2 时间
1.2.1 获取系统当前时间
需要导入datetime库
from datetime import datetime
current_date = datetime.now()
1.2.2 获取之前的时间
需额外再导入timedelta库
from datetime import datetime,timedelta
today = datetime.now()
one_day = timedelta(day=1)
yesterday = today - one_day
1.2.3 仅保留年、月、日输出
current_date = datetime.now()
print(str(current_date.day))
print(str(current_date.month))
print(str(current_date.year))
1.2.4 固定格式
birthday=input("your birthday: ")
#Y一定要大写
birthday_date = datetime.strptime(birthday,'%d/%m/%Y')
print(str(birthday_date))
输入:25/02/1998
输出:1998-02-25 00:00:00
1.3 条件语句
1.3.1 if
例如:设定某省的税率
if province=="HeNan":
tax=0.1
else:
tax=0.2
需要注意的就是“冒号”:
不能漏打
1.3.2 elif
当多个条件结果只可能有一种结果发生时使用
例如:多个省的税率
if province=='HeNan':
tax=0.1
elif province=='HuBei':
tax=0.2
elif province=='GuangDong':
tax=0.3
1.3.3 or/in
当多个条件有相同的结果时使用
例如:某两个省有相同的税率
if province == 'Henan'or'Hubei':
tax=0.1
elif province == 'Hebei':
tax=0.2
或者
if province in ('Henan','Hubei'):
tax=0.1
elif province == 'Hebei':
tax=0.2
建议同结果条件很多时用in
会相对整齐一些
1.3.4 缩进
在python中,缩进相当于C/C++中的中括号{}
,表示嵌套作用
例如:
if country == 'China': #只有当这条语句为真才会执行下方缩进语句
if province in ('Henan','Hubei'):
tax=0.1
elif province == 'Hebei':
tax=0.2
else: #否则跳转到此处执行
tax=0.0
1.3.5 and
and
与or
对应C语言中的&&
与||
,因此不多做阐述
1.3.6 布尔变量
True
和False
在python
中是布尔型关键词,勿当成字符串
一般是为了更好地看懂嵌套式的条件语句而使用,例如:
if gpa>= .85 and low_grade>= .70:
honor=True
else:
honor=False
if honor: #这样更简洁,不用写成honor==True
print('Well done')
1.4 列表与数组
列表(List)与数组(Array)的区别:
-
Array只能同时存储一种数据类型
-
而List可以任意混杂多种数据类型
1.4.1 列表(list)
scores=[]
scores=append(98) #在尾部加入元素
scores=append(99)
print(scores) #输出为[98,99]
print(scores[1]) #下标从0开始,故输出为99
1.4.2 数组(Array)
数组使用前需导入数组库
from array import array
scores=array('d')
scores.append(97)
scores.append(98)
print(scores)
print(scores[1])
注意第二句scores=array('d')
,这是在初始化数组存储的数据类型,d
是8字节的float型,其余类型可查阅python官方手册——array
另外补充一些函数
from array import array
names=['rose','jack']
print(len(names)) #打印数组长度,一组字符串长度为1
names.insert(0,'bill') #在序号0(开头)插入
print(names)
names.sort() #数组自动排序,字符串按首字母先后排
print(names)
输出结果:
2
['bill', 'rose', 'jack']
['bill', 'jack', 'rose']
继续补充,获取数组内的几个元素:
names=['bill','rose','jack']
part=names[0:2]
print(part)
其中names[0:2]
是指从第0序号的元素开始,取两个元素
输出结果:
['bill', 'rose']
1.4.3 字典
-
字典可以看作是将数字序号变成具体字符串的列表
-
字典同样可以任意同时储存多种数据类型
例如:
person={'first':'edson'} #第一种新增元素方式
person['last']='macleod' #第二种新增元素方式
print(person) #打印完整字典内容
print(person['first']) #抓取单项
输出结果:
{'first': 'edson', 'last': 'macleod'}
edson
1.5 循环
1.5.1 for
python
中的for循环与C语言区别略大,它相当于直接创建一个临时量,遍历你所指定的列表或范围,例如:
for name in ['jack','rose']:
print(name)
输出为:
jack
rose
每个结果自带回车
也可以打印数字,例如:
for index in range(0,3):
print(index)
输出为:
0
1
2
注意,这个range指定的范围是左闭右开的
1.5.2 while
python
的while循环与C语言基本无异,无非是将格式变为:
while CONDITION :
CODE
1.6 函数
1.6.1 定义
python
的函数直接用def
来定义就完事,甚至参数也不用声明类型,不像C语言还要分void,int之类的
格式如:
def func_name(para_name1,para_name2): #参数名可以直接留空
CODE
return X #无返回值就不用写return
再次强调,缩进不能漏
函数的定义必须在调用之前
1.6.2 参数
关于参数,python
中还有一些技巧。
我们可以给一个函数设定多个参数,但除第一个参数外,其余参数都有设定默认值,这样一来,在调用函数时,可以只写入一个参数运行,或者根据需要再输入其他参数变更默认值
例如:
def get_initial(name,fu=True): #默认大写
if fu :
initial=name[0:1].upper
else:
initial=name[0:1]
return initial
Name=get_initial(first_name) #这样Name的结果就是大写
另外,如果函数参数的定义顺序不清楚,也可以使用直接赋值使用函数
例如:
def get_initial(name,fu=True):
if fu :
initial=name[0:1].upper
else:
initial=name[0:1]
return initial
Name=get_initial(fu=True,name=first_name) #采用参数直接赋值,不管定义顺序
实际上,对于自定义了很多参数的函数,采用直接赋值,可以让其他维护代码的人更容易看懂,是个好习惯
2 入门
2.1 模块与包
将定义的函数封装,即形成一个模块(module),多个模块可以整合,形成一个包(package)。我们如果要使用某个别人早已设计好的函数,就需要下载对应的包,然后调用其中对应的模块的对应函数。
这样大大提升了代码的可重构性
拒绝重复造轮子
2.1.1 模块创建与使用
所谓模块,本身就是一个python
文件,但是其中只进行函数的描述,例如:
- 创建一个
helpers.py
的文件
def display(message,is_warning=False):
if is_warning:
print('This is a warning')
print(message)
- 接着,我们再创建一个文件
demos.py
我们想在demos中使用helpers模块中的display函数,那就要先调用
调用一般有三种方式:
#将所有函数都调用并放在命名空间helpers下
import helpers
helpers.display('Not a warning') #使用时需加上命名空间
#将所有模块导入当前命名空间
from helpers import *
display('Not a warning')
#导入确切的模块到当前命名空间
from helpers import helpers
display('Not a warning')
这三种方式除了使用函数时有一点区别,无本质差异
2.1.2 包
包就是已发布的模块的集合
安装包需要用pip命令,例如安装一个名叫colorama
的包
pip install colorama
如果有多个包要安装,则可以创建一个文本文件,比如requirements.txt
,写入包的名称
colorama
然后用命令
pip install -r requirements.txt
一次安装多个包
2.2 虚拟环境
python
安装包时,默认是安装到全局环境下的,有时候是由于不同python版本的问题,或是包的版本问题,需要切换到不同的环境下运行,这时候就需要用到虚拟环境。
由于不同系统的配置有差异,请自行查找相关资料
2.2.1 进入venv
配置完虚拟环境后,切换到对应目录,在powershell
输入
.\.venv\Scripts\activate.ps1
这个是windows环境下,并且个人的目录形式,对于不同情况可能需要修改这条命令
可以看到状态前有一个(venv),表明已经进入虚拟环境
2.3 API
2.3.1 Web service
除了下载包,把模块下载到本地使用,我们也可以直接利用网络进行模块调用。
网络模块调用时需提供密钥,有时需要付费才可获得对应密钥
2.3.2 配置
在调用API之前,我们要先阅读对应API的说明文档,里面会说明调用的方法,一般还可以配合azure来配置
具体流程看微软py教程p37
2.3.3 调用
使用网络调用前,需要导入库import request
和import json
之后按照所选的API的说明文档使用
要注意是post还是get
2.4 Json
利用API反馈回来的数据通常会以json
格式呈现。
json
是一种标准数据格式,用来传递数据。没经过一些优化显示的json数据通常看起来很乱。
网上有一些工具,把原始json数据复制粘贴进去可以得到更直观的数据表
2.4.1 获取json
json的结构实际上类似文件夹,数据被分存在不同的目录(子类)下。因此,直接打印反馈的json中某个特定数据只需按照格式输出,例如:
print(results['firstdoc']['seconddoc']['dataname'])
打印多个可以采用循环结构(参见基础内容)
2.4.2 创建json
我们不光要接收json格式的数据,有时还需要发送json格式的数据。
准确来说,json是以关键字对应值这样的键值对的格式存储的,这种格式不禁让我们想起之前基础学过的list存储方式——字典
没错,利用json.dumps()
函数,我们可以将字典格式的list直接转成json格式,例如:
person_dict=['first':'edson','last':'macleod']
person_json=json.dumps(person_dict)
person_json
当中存储的就是json格式的信息了
如果要在键值对下继续创建子键值对,就需要在字典下创建字典
例如:
person_dict=['first':'edson','last':'macleod']
staff_dict={} #初始化一个新字典
staff_dict['Program Manager']=person_dict
staff_json=json.dumps(staff_dict)
这样,person
就成了staff
键值对下的子键值对
2.5 环境变量
利用.env
来保护你的敏感信息
- 首先要安装
dotenv
包:
pip install python-dotenv
dotenv有各种对应的平台
- 创建文件
.env
,写入
PASSWORD=DON_T SHARE THIS VALUE
- 创建一个python文件,写入
from dotenv import load_dotenv
load_dotenv()
import os
password=os.getenv('PASSWORD')
print(password)
输出为:
DON_T SHARE THIS VALUE
在没有
dotenv
的保护下,os.getenv('OS')
返回的结果是Windows_NT
2.6 装饰器(decorator)
当我们要自己创建框架时,就会需要用到装饰器
先看一个本地创建的装饰器使用例:
def logger(func):
def wrapper():
print('Logging execution') #code1
func() #code2
print('Done logging') #code 3
return wrapper
@logger #调用装饰器
def sample():
print('-- Inside sample function')
sample()
输出结果为:
Logging execution
-- Inside sample function
Done logging
于是我们可以看到,这段程序先是运行了code1,接着运行code2,对应的是下面的sample函数,然后再运行code3
所谓装饰器,效果就是让你的代码运行出来有个类似“正在登录…”,中间执行,最后“完成”,这样的框架。这也是装饰器的最普遍应用。
当然,装饰器也可以用特殊方式通过网络调用使用,并不一定要自己设定。