1 Python介绍
python之父:Guido van Rossum“龟叔”1989年,YouTube、网络游戏后台、在线游戏后台都是Python开发的。
高级编程语言会提供比较完善的基础代码库,能直接调用,比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库。Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。
Python的定位是“优雅”、“明确”、“简单”,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常复杂的程序。总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。
适合网络应用,包括网站、后台服务等等;
许多日常需要的小工具,包括系统管理员需要的脚本任务等等;
把其他语言开发的程序再包装起来,方便使用。
2 Python3.7 安装
版本问题:Python安装时需要考虑现有机器学习包的支持情况,例如Tensorflow和Pytorch是不支持最新版本的Python的。从TensorFlow的官网可以看到,Python3.7兼容性最好。安装时要注意把Add to path选上,另外更改安装目录。安装完成后需要更改Python的包管理器pip
由于众所周知的原因,国内下载第三方包十分慢,因此使用镜像地址。常用地址是阿里云或清华源。切记使用管理员模式。
下载pip
https://pypi.org/project/pip/#files
进入压缩文件所在包,安装
python setup.py install
记得设置环境变量(python和pip都需要)
换源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
也可以直接下载miniconda(配置环境等更方便严谨)
https://zhuanlan.zhihu.com/p/133494097
2.1 终端
1.windows power shell (管理员打开)
2.win+R,输入cmd
2.1.1 power shell 常用指令
tab 自动补全
cd D: /进入D盘
cd ~/
cd Desktop
ls 或 dir /展开
pip list ///查看安装了哪些包
pip show ...
pip search ...
pip install ... -i 换源
python 进入 交互环境模式
exit(0) 退出
2.2 IDE
2.2.1 pycharm
pycharm是IDE(集成开发环境)
模仿matlab工作区,社区版(免费版)足够使用
2.2.2 Vscode
商店:python和jupyter 搭建IDE
记得要先在终端 pip install jupyter
如果直接使用 jupyter,在终端输入 jupyter notebook
3 python基础
3.1 标识符
变量名、函数名等都属于标识符
标识符不能用以下这些关键字,也不能以数字开头,不能有空格,可以有 "_"(下划线)。
import keyword
print(keyword.kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or',
'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
3.2 变量
python不用声明变量,直接赋值就行。
变量=变量名+变量内容
盒子本身是(变量名)(标识符)
给盒子里装的东西(变量的内容),整体就叫变量。
相当于就是我们先创建一个新盒子,在电脑内存中,起名为name,此时盒子里没有数。然后我们在电脑内存中,输入东西,这个东西现在不确定在哪。
通过“=”号!赋值运算!把这个东西放到名字为name的盒子中。
name='marry'
print(name)
print('标识',id(name))
print('类型',type(name))
print('值',name)
# 变量的多次赋值:
name='marry'
name='me'#变量名指向最新的空间
# 方法:
name.title() name.upper() name.lower()
3.3 语句与注释
语句一般不加分号,且注释 # 后面一般有一个空格(规范)
3.4 模块
一个模块即一个文件。
当语句以冒号 : 结尾时,缩进的语句视为代码块。按照约定俗成的惯例,应该始终坚持使用4个空格的缩进。
import 模块名
# print(模块名.代码元素名)
from 模块名 import 代码元素
from 模块名 import 代码元素 as 代码元素别名
# hello.py
x='nihao'
y=True
z=20.0
# world.py
import hello
from hello import z
from hello import x as x2
x=100
y=20
print(x) #100
print(y) #20
print(z) #20.0
print(x2) #nihao
4 数据类型
所有数据类型都属于某一类
4.1 整数类型
4.2 浮点类型
a=-3.1415926
print(a,type(a))
# 浮点数相加减的时候,可以用decimal模块来调整小数点位数
4.3 布尔类型
a=True
print(a,type(a)) # True <class 'bool'>
print(True+1) #2 可以转为数 对为1,错为0
4.4 序列类型
序列:可迭代、元素有序
序列特点:索引、切片、成员测试
a='hello' # 索引 print(a[0]) print(a[-5])
a='hello'
# 01234
print(a[0:3]) #hel 从索引0开始,不包括索引3
print(a[0:3:2]) #hl 从索引0开始,不包括索引3,即hel,先取第0个元素h,步长为2,再取l
print(a[1:4:3]) #e 从索引1开始,不包括索引4,即ell,先取第0个元素e,步长为3
a='abcdefg'
# 0123456
print(a[0:3]) #abc 从索引0开始,不包括索引3
print(a[0:7:2]) #aceg 从索引0开始,不包括索引7,即abcdefg,先取第0个元素a,步长为2(包括自身),再取c,e,g
print(a[1:7:3]) #be 从索引1开始,不包括索引7,即bcdefg,先取第0个元素b,步长为3(包括自身),再取e
4.4.1字符串类型(不可变)
#字符串中出现\t是制表符,\n是换行符
name='sun'
age=22
print(type(name),type(age))
print('我的名字是' +name+ ',我今年' +str(age)+ '岁') # 我的名字是sun,我今年22岁
4.4.2 元组 tuple( )(不可变)
# 第一种方法 小括号即可
a=('hello','world',98)
b=('no','yes',22)
# 索引 0 1 2
print(a)
print(a[0])
print(a.index(98)) # 获取指定元素的索引
# 第二种方法 调用tuple函数
c=tuple('helloworld')
d=tuple(['aaa',99])
e,f=d #元组拆包,分别赋给不同变量
print(c)
print(d)
print(e)
print(f)
4.4.3 列表 list [ ](可变)
# 第一种方法 中括号即可
a=['hello','world',98]
b=['no','yes',22]
# 索引 0 1 2
print(a)
print(a[0])
print(a.index(98)) # 获取指定元素的索引
a.append(80) # 追加元素(单个元素)
a.extend(b) # 追加元素(多个元素)
a.insert(1,111) #在索引1前面加入111这个元素
a[0]=222 #将索引0位置的元素替换为222
del a[0] #根据索引,删除元素 (语句删除,不能再访问)
a.pop(2) #根据索引,删除元素(可设置变量,继续访问)
a.remove(22) #根据值,删除22这个元素(可设置变量,继续访问)
a.sort() #永久排序,按字母a-z顺序
a.soet(reverse=True) #永久排序,按字母z-a顺序
a.sorted() #临时排序,按字母a-z顺序
a.reverse() #永久排序,反转倒装
len(a) #确定a列表的长度
print(a)
# 第二种方法 调用list函数
Lst2=list(['helloworld',99])
print(Lst2)
4.5 字典类型dict{ }
无序、可变、key-value成对元素
a={1:11,2:22,3:33}
print(a)
print(a.items())
print(a.keys())
print(a.values())
b=dict({1:11,2:22,3:33})
c=dict(((1,11),(2,22),(3,33)))
print(b)
print(c)
{1: 11, 2: 22, 3: 33}
dict_items([(1, 11), (2, 22), (3, 33)])
dict_keys([1, 2, 3])
dict_values([11, 22, 33])
4.6 集合类型 set( )
无序、可变、无key的字典,不能包含重复元素
import curses
a={11,22,33,44,11,22}
print(a)
a.add(55)
a.remove(44)
print(a)
b=set('hello')
c=set('world')
print(b)
print(c)
5 组织结构
5.1 基础
5.1.1 对象的bool值
Python一切皆对象,bool( )获取对象的布尔值 # False、True
空、None、0的布尔值为False
5.1.2 条件表达式
#比较键盘两个数的大小
num_a=int(input("请输入第一个整数"))
num_b=int(input("请输入第二个整数"))
print("使用条件表达式")
print( str(num_a)+"大于等于"+str(num_b) if num_a>=num_b else str(num_a)+"小于等于"+str(num_b) )
# 注意字符串的连接问题!
5.1.3 pass语句
搭建语法结构,先占一个语句位置,使其不报错。
5.2 if 单分支结构
money=1000 #银行卡余额
s=int(input("请输入取款金额"))
if money>=s:
money=money-s
print("取款成功,余额为:",money)
5.3 if-else 双分支结构
# 输入一个数,判断是奇数还是偶数
a=int(input("请输入一个整数"))
b=a%2
if b==0:
print("这个数是偶数")
else:
print("这个数是奇数")
5.4 if-elif-else 多分支结构
# 输入成绩,判断分数区间
# 0-100以外的数字为非法数字
a=int(input("输入成绩"))
if a>=90 and a<+100:
print("大于90")
elif a>=80 and a<=89:
print("80-90之间")
elif a<80 and a>=0:
print("小于80")
else:
print("对不起,这个数字有问题")
#python特有写法
# 0<=a<=59
5.5 if-if-else-else 嵌套if结构
# 会员200打8折,100打9折,其他不打折
# 非会员200打9折,其他不打折
a=bool(input("请输入是否是会员(0或1)"))
if a==True:
money=int(input("请输入卡内余额"))
if money>=200:
print("8折")
elif 200>money>=100:
print("9折")
else:
print("不打折")
else:
money=int(input("请输入卡内余额"))
if money >= 200:
print("9折")
else:
print("不打折")
5.6 while循环
#计算0到4的和
a=0
sum=0
while a<5:
sum=sum+a ## 条件执行体
a=a+1 ## 改变变量
print("和为",sum)
#计算1-100的偶数和
a=1
sum=0
while a<=100:
if a%2==0:
sum=sum+a
a=a+1
print("和为",sum)
#注意intented block 缩进块!!!
5.7 for-in循环(遍历)
#可迭代对象为字符串或者序列,把可迭代对象依次取值放到自定义变量里。
for a in "pri":
print(a) #把a的值输出
for b in range(3):
print("b") #循环3次输出b
aas=['1','2','3']
for aa in aas:
print(aa)
#输出1-100的偶数和
sum=c=0
for c in range(1,101):
if c%2==0:
sum=sum+c
c=+1
print("和为",sum)
p r i
b b b
和为 2550
# 水仙花数 153=3*3*3+5*5*5+1*1*1
# 输出100-999之间的水仙花数
# 百位数 个 a%10 十 a//10%10 百 a//100
for a in range(100,1000):
if a==(a//100)**3+(a//10%10)**3+(a%10)**3:
print("水仙花数为" ,a)
a=+1
5.8 break
# 输入密码,有三次尝试机会,如果输入正确,就退出循环
for a in range(3): #a只是一个循环次数!!!
mima=input("请输入密码:")
if mima=="8888":
print("密码正确")
break
else:
print("密码不正确")
5.9 contiue
5.10 else
for a in range(3): #a只是一个循环次数!!!
mima=input("请输入密码:")
if mima=="8888":
print("密码正确")
break
else:
print("密码不正确")
else:
print("对不起,三次密码都输入错误")
5.11 嵌套循环
#输出3行4列矩阵
for i in range(3):
for j in range(4):
print("*",end="\t") #不换行
print() #换行
5.12 二重循环中的break和contiue
6 函数、类、方法
6.0 函数与方法(字符串中使用变量)
函数:
函数名(输入参数):
方法:
变量名.方法名()
函数: def
类:class def 类的声明和初始化,创建一个对象,当没有能表达所需的数据类型时,则使用一个类。
强制类型转化函数:
str(age) # 转变为字符串
int(age) # 转变为整型
abs(-20) #20 输出绝对值函数
max(1,2,3) #3 输出最大值函数
#函数名其实是指向一个函数对象的引用,完全可以把函数名赋给一个变量
a=abs
a(-2)
#自定义函数需要返回两个数的情况
import math
def qqq(a,b,c):
m=b*b-4*a*c
x=(-b+math.sqrt(m))/(2*a)
y=(-b-math.sqrt(m))/(2*a)
return x,y
print('X1和X2的答案分别是:'+str(qqq(2,3,1))) #别忘了写逗号
print(f"X1和X2的答案分别是:{qqq(2,3,1)}") #别忘了写逗号
#X1和X2的答案分别是: (-0.5, -1.0)
def calc(a,b): #形式参数 形参
c=a+b
return c
dddd=calc(10,20) #实际参数 实参
print(dddd)
# 函数调用的参数传递-位置实参-关键字实参
dddd=calc(10,20)
dddd=calc(b=20,a=10)
6.0 递归函数
# 如果一个函数在内部调用自身本身,这个函数就是递归函数。
# 计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示
# fact(n)=n!=1×2×3×⋅⋅⋅×(n−1)×n=(n−1)!×n=fact(n−1)×n
# 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
# 于是,fact(n)用递归的方式写出来就是:
def fact(n):
if n==1:
return 1
else:
return n * fact(n - 1)
a=fact(3)
print(a)
6.1 print输出函数
# 直接输出数字(计算机能自己理解,不用引号)
print(111)
# 直接输出字符串
# 字符串是变化多样,计算机不能理解(需要单引号,就是让计算机不用理解,直接输出)
print('hello world'',''hello world'","'hello world')
# 含有运算符
print(3+1)
# 可以输出到文件中,aaa是变量名,
aaa=open('D:/text.txt','a+') #a+表示没有的话,会创建这个文件。有的话,会重复输入。
print('hello world',file=aaa)
aaa.close()
6.2 input输入函数
#input是str(字符串)类型
present=input('你想要什么礼物呢?') #这是输入提示
print(present,type(present))
# 你想要什么礼物呢?111
# 111 <class 'str'>
# 从键盘输入两个数,求和。
a=input("输入第一个数:")
b=input("输入第二个数:")
print(type(a),type(b))
print(int(a)+int(b))
# 输入第一个数:10 输入第二个数:20
# <class 'str'> <class 'str'>
# 30
# 或者一开始就把格式转换过来
a=input("输入第一个数:")
a=int(a)
b=input("输入第二个数:")
b=int(b)
print(type(a),type(b))
print(a+b)
6.3 range函数-生成一系列数
6.4 list函数-创建列表
#range函数 用于生成一个整数序列
r1=range(5) #从0开始,不包括5,(步长为1)
r2=range(1,5) #从1开始,不包括5,(步长为1)
r3=range(1,5,2) #从1开始,不包括5,步长为2
print(r1,r2,r3)
print(list(r1),list(r2),list(r3))
print(5 in r3)
print(5 not in r3)
#range(0, 5) range(1, 5) range(1, 5, 2)
#[0, 1, 2, 3, 4] [1, 2, 3, 4] [1, 3]
#False
#True
#把1到10的平方和写入列表
squares=[]
for a in range(1,11):
square=a**2
squares.append(square)
print(squares)
6.4 类与实例
class Student(object): #Student为类名
def __init__(self, name, score):
#强制给类里面的(实例self)上name和score属性(和函数的唯一区别)
self.name = name
self.score = score
def get_grade(self): #类的优势!
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
def print_score(self): #类的优势!
print('%s: %s' % (self.name,self.score))
lisa = Student('Lisa', 99)
bart = Student('Bart', 59)
print(lisa.name, lisa.get_grade())
print(bart.name, bart.get_grade())
lisa.print_score()
class Dog(): #类名要大写
def __init__(self,name,age) :
self.name=name
self.age=age
def sit(self):
'''模拟小狗蹲下'''
print(self.name.title()+ 'is now sitting')
def roll_over(self):
print(self.name.title()+ "rolled over")
my_dog=Dog("wangzai",3)
my_dog.sit()
my_dog.roll_over()
7 杂
7.1 运算符
7.1.1 算术运算符
7.1.2 位运算符
7.1.3 比较运算符
a=1
b=1
print('a和b的value一样吗',a==b)
print('a和b的id一样吗',a is b)
list1=[1,2,3,4]
list2=[1,2,3,4]
print('1和2的value一样吗',list1==list2)
print('1和2的id一样吗',list1 is list2)
print(id(list1),id(list2))
'''
a和b的value一样吗 True
a和b的id一样吗 True
1和2的value一样吗 True
1和2的id一样吗 False
2256309925632 2256309874816
== != > >= < <=
'''
7.1.4 布尔运算符
# and or not 与或非 in,not in
a=True
b='ttttu'
print(not a) #False
print('u' in b) #True
7.1.5 赋值运算符
a+=10 a=a+10
a/=3 a=a/3
#交换不需要中间变量
a,b=5,2
print('交换之前:',a,b)
a,b=b,a
print('交换之后:',a,b)
# 交换之前: 5 2
# 交换之后: 2 5
7.2 转义字符与原字符
# \这叫反斜线 /这叫斜线
print('我要输出单引号双引号和反斜线')
print('\',\",\\')
print('我要让转义字符不起作用')
print(r'\\')#前面加r就不起作用了
#关于制表位的使用 四个字符为一个表位
print('hello\tworld')
7.3 二进制
计算机只认识1和0
口口 2个位置,4个状态
口口口口口口口口 8个位置,256个状态(ASCII码)
7.4 文件读写
# 读取文件
# 读取文件,显示内容
with open('文件名.txt') as file_object: #文件命名为file_object。相对路径行不通可以用绝对路径
contents = file_object.read() #读取文件内容,传入字符串中
print(contents.rstrip()) #rstrip()方法删除字符串末尾的空白
# 逐行读取
with open('文件名.txt') as file_object:
lines = file_object.readlines() #readlines()方法从文件中读取每一行,储存在一个列表中
for line in file_object:
print(line)
# 整体写入
with open('filename.txt','w') as file_object: #以写入模式打开文件,如果文件不存在会自动创建,已经存在会清空文件
file_object.write("I love programming.") #注意只能写入字符串,写入多行时可以加换行符
# 附加内容
with open('filename.txt','a') as file_object: #以附加模式打开文件,不会清空原有文件,写入的行添加到文件末尾
file_object.write("\nI love programming.")