PyCharm | 功能强大,有着丰富的第三方库 |
---|---|
Spyder | 一款为了数据科学工作流做了优化的开源Python集成开发环境。它是附在Anaconda软件包管理器发行版中的 |
Thonny | 针对新手的一款集成开发环境 |
Sublime Text | Sublime Text 支持Python代码编译同时兼容所有平台 |
Atom | 兼容所有平台的Atom被称为“21世纪可破解的文本编译器“ |
VS Code | 轻量级,功能强大 |
Kite | 一款是基于AI技术开发的程序辅助软件,不仅仅是代码补全 |
Vim | – |
Eclipse with PyDev | – |
GNU Emacs | 是可扩展,自定义的文本编译器,甚至是更多的功能。Emacs的核心是Emacs Lisp解析器,但是支持文本编辑 |
VS | 支持各种平台的开发,并且附带了自己的扩展插件市场 |
(1)与之前的编程语言相比,Python完成任务的效率较高。
(2)相对于Java、C++等编程语言,更加容易上手,入门快,简单易懂
(2)免费且开源
(3)具有丰富的库
(1)Web开发。利用Python Web做出前端界面。
(2)网络爬虫。从网络上获取有用的数据或信息,可以节省大量人工时间
(3)计算与数据分析。不仅支持各种数学运算,还可以绘制高质量的2D和3D图像。和科学计算领域最流行的商业软件Matlab相比,Python比Matlab所采用的脚本语言的应用范围更广泛,可以处理更多类型的文件和数据。
(4)人工智能。Python在人工智能大范畴领域内的机器学习、神经网络、深度学习等方面都是主流的编程语言,得到广泛的支持和应用
(5)自动化运维。Python编写的系统管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的shell脚本。
(6)云计算。Python的最强大之处在于模块化和灵活性,而构建云计算的平台的IasS服务的OpenStack就是采用Python的,云计算的其他服务也都是在IasS服务之上的。
(7)网络编程。Python提供了丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。
(8)游戏开发。很多游戏使用C++编写图形显示等高性能模块,而使用Python或者Lua编写游戏的逻辑、服务器。相较于Python,Lua的功能更简单、体积更小,然而Python则支持更多的特性和数据类型。
(9)桌面软件。Python在图形界面开发上很强大,可以用tkinter/PyQT框架开发各种桌面软件!
(10)金融分析。
(1)Python语言不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量,但是python属于强类型语言,python编译器会根据赋值或运算来自动推断变量类型。
(2)Python同时也是一种动态类型语言,变量的类型也是可以随时变化的。
print("Hello World\n 你好 Python!")
x="hello world"
print(type(x)) #查看x的对应类型
name=input("请输入姓名:")
print(name)
isinstance(3,int) #测试对象是否为某个类型的实例
x=3
print(x**2) #输出为9 x的平方
x=4
y=3
print("x=%d,y=%d" %(y,x))
a=1+2j
b=complex(4,5) #表示复数4+5j
print(a+b)
t=True # bool变量首字母要大写
bool(0) # False
a=1
id(a) #获得a的内存地址
逻辑运算符:
not(逻辑非) and(逻辑与) or(逻辑或)
#用单引号、双引号、三引号括起来的符号系列成为字符串
False+3 #False当0处理
"a"*10 # aaaaaaaaaa
3/3 5//3 # /表示除法 //表示整除
3 in [1,2,3] #True
{
1,2,3}|{
4,5,6} #并集
{
1,1,4}&{
4,5,6} #交集
{
1,4,5}^{
1,4,5} #对称差
@ #矩阵相乘运算符
#双分支结构
a=5
print(6) if a>3 else print(5)
#获取当前时间
import time
start=time.time()
a=float(input('输入三角形边长1:'))
b=float(input('输入三角形边长2:'))
c=float(input('输入三角形边长3:'))
if a+b<c and a+c <b and b+c<a:
print("三条边不能构成三角形")
else:
L=(a+b+c)/2
S=(L*(L-a)*(L-b)*(L-c))**0.5
print('三角形的面积为 %0.2f' %S);
x=int(input("请输入一个人的出生年份:"))
y=2020-x
print(y)
a=int(input("请输入a的值:"))
b=int(input("请输入b的值:"))
if (a>b):
print("a的值比b大,为%d" %a);
elif (a==b):
print("a的值和b的一样大");
else:
print("b的值比a大,为%d" %b);
year=int(input("请输入年份:"))
if (year%400==0 or(year%4==0 and year%100 !=0)):
print("你输入的%d为闰年"% year)
else:
print("你输入的%d为平年"% year)
a=int(input("请输入a的值:"))
b=int(input("请输入b的值:"))
c=int(input("请输入c的值:"))
if a<b:
(a,b)=(b,a)
if a<c:
(a,c)=(c,a)
if b<c:
(b,c)=(c,b)
print(a,b,c)
score=float(input("请输入学生成绩:"))
if score>=90 and score<=100:
print("优")
elif score>=80 and score <90:
print("良")
elif score>=70 and score <80:
print("中")
elif score>=60 and score<70:
print("及格")
else:
print("不及格")
sum_all=0
sum_double=0
sum_odd=0
for i in range(1,101):
sum_all+=i;
if(i%2==0):
sum_double+=i
sum_odd=sum_all-sum_double
print("奇数之和为%d,偶数之和为%d"%(sum_odd,sum_double))
num=0
mark=0
average=0
while True:
grade=input("请输入学生的成绩:")
if grade=='Q' or grade=='q':
break;
if float(grade)<0 or float(grade)>100:
print("请重新输入:")
continue
num+=1
mark+=float(grade)
average=mark/num
print("输入学生的人数为:%d,平均成绩为%0.2f"%(num,average))
import math
r=float(input("请输入圆的半径r:"))
c=2*math.pi*r
s=math.pi*r*r
print("圆的周长为%.2f,圆的面积为%.2f" %(c,s))
surname=(input("请输入你的姓:"))
name=(input("请输入你的名字:"))
pn=surname+name
print("你好,%s" %pn)
str1="张"
str2="英"
print('''"你好,%s%s!"'''%(str1,str2))
print(f'"你好,{str1}{str2}!"')
for a in range(1,10):
b = 1
while b <= a:
print('%d*%d=%d' % (b, a, a * b), end="\t")
b += 1
print()
import random
num=random.randint(1,10)
count=0
while(count<3):
a=int(input("请输入一个数:"))
print(num)
if(a==num):
print("You win !")
break;
else:
count+=1
continue
for n in range(100,1,-1):
for i in range(2,n):
if n%i==0:
break
else:
print(n)
break
append():append()的参数被视为对象 函数用于在列表末尾添加新的对象,该方法无返回值,但是会修改原来的列表。
append的速度比”+”的速度快
测试代码:
import time
sum=[]
start=time.time()
for i in range(10000):
sum=sum+[i]
print(len(sum),',“+”执行消耗时间:',time.time()-start)
sum=[]
start=time.time()
for i in range(10000):
sum.append(i)
print(len(sum),',“append”执行消耗时间:',time.time()-start)
#或者
from timeit import Timer
def list_append():
lists=[]
for i in range(1000):
lists.append(i)
def list_add():
lists = []
for x in range(1000):
list1 = [x]
lists =lists+list1
add_time=Timer('list_add()','from __main__ import list_add')
print('"+"插入列表时间:',add_time.timeit(1000))
append_time=Timer('list_append()','from __main__ import list_append')
print('append插入列表时间:',append_time.timeit(1000))
x=[3,2,1,2,3,3,3]
for i in x[::]:
if i==3:
x.remove(i)
print(x)
list1=[(i,j) for i in range(3) for j in range(3) if i!=j]
print(list1) #实现0、1、2任意两个元素的元组组合
#或者
list1=[i for i in range(0,3)]
list2=[i for i in range(0,3)]
list_com=[]
list_end=[]
for i in range(len(list1)):
for j in range(len(list2)):
if(i!=j):
list_com.append((i,j))
list_end=tuple(list_com)
print(list_end)
import string
import random
x= string.ascii_letters + string.digits + string.punctuation
y = [random.choice(x) for i in range(1000)]
z=''.join(y)
data = dict()
for ch in z:
data[ch] = data.get(ch,0) + 1 #get(ch,0) 返回ch出现的次数,若没有返回0
print(data)
x= {
1, 2, 3, 4,8,7,9}
y= {
1, 4, 5,10,7,13}
while True:
flag=input("请输入你选择的操作:")
if(flag=="a"):
print('交集')
print(x & y)
print(x.intersection(y))
elif(flag=="b"):
print('并集')
print(x | y)
print(x.union(y))
elif(flag=="c"):
print('差集')
print(x - y)
print(x.difference(y))
elif(flag=="d"):
print('对称差分集')
print(x ^ y)
print(x.symmetric_difference(y))
else:
print("非法操作!")
break
insert()和extend()都是在列表的尾部插入数据,区别:
insert()将要传入的参数视为一个列表元素去处理,其参数有两个,第一个参数是索引点,即插入的位置,第二个参数是插入的元素。
extend()函数会将传入的参数视为列表,只接受一个参数,插入列表元素不一定是同类型,并将该列表的每个元素一一逐个插入到原列表尾部,如果该参数不是列表,将报错。
测试代码:
import time
def Insert():
a=[]
for i in range(10000):
a.insert(0,i)
def Append():
a=[]
for i in range(10000):
a.append(i)
start=time.time()
for i in range(10):
Insert()
print('Insert:',time.time()-start)
start=time.time()
for i in range(10):
Append()
print('Append:',time.time()-start)
#或者
from timeit import Timer
def list_append():
lists=[]
for i in range(1000):
lists.append(i)
def list_insert():
lists=[]
for i in range(1000):
lists.insert(0,i)
append_time=Timer('list_append()','from __main__ import list_append')
print('append插入列表时间:',append_time.timeit(1000))
insert_time=Timer('list_insert()','from __main__ import list_insert')
print('insert插入列表时间:',insert_time.timeit(1000))
a=[-1,-4,6,7.5,-2.3,12,9,-11]
b=[]
for i in a:
if i>0:
b.append(i)
print(b)
setA = {
4, 5, 6, 7}
setB = {
4, 5, 9, 10, 6}
print(' setA 和 setB交集:')
print(setA & setB)
print(setA.intersection(setB))
print(' setA 和 setB并集:')
print(setA | setB)
print(setA.union(setB))
print(' setA 和 setB差集:')
print(setA - setB)
print(setA.difference(setB))
a=int(input("请输入一个大于2的自然数:"))
lst=[]
if a<=2:
print("请输入大于2的自然数!")
for i in range(1,a+1,1):
for j in range(2,i):
if i%j==0:
break
else:
lst.append(i)
print(lst)
print(sum([2**x for x in range(64) ]))
# 或者:
# sum=0
# for i in range(64):
# sum+=2**i
# print(sum)
timeit模块
timeit模块可以用来测试一小段Python代码的执行速度
class timeit.Timer(stmt='pass',setup='pass',timer=<timerfunction>)
Timer是测量小段代码执行速度的类:其中stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;timer参数是一个定时器函数与平台有关通常保持默认
使用方法:
timeit.Timer.timeit(number=1000000)
timeit.Timer的对象求出后,调用其timeit()方法:number参数是测试代码时的测试次数,默认为1000000次,返回一个float类型的秒数。
#coding=utf-8
from timeit import Timer
def append_list():
li=[]
for i in range(10000):
li.append(i)
def insert_list():
li=[]
for i in range(10000):
li.insert(0,i)
append_time=Timer('append_list()','from __main__ import append_list') #求出timeit.Timer的对象
print('append插入列表时间:',append_time.timeit(1000))
insert_time=Timer('insert_list()','from __main__ import insert_list') #求出timeit.Timer的对象
print('insert插入列表时间:',insert_time.timeit(1000))
结果:
append插入列表时间: 0.7346160988088778
insert插入列表时间: 18.13291039210702
实现一:新申请一个数组
nums = [2,3,4,10,9,11,19,14]
newnums=[]
for i in nums:
if i>=5:
newnums.append(i)
newnums
实现方法二:利用列表推导式
nums = [2,3,4,10,9,11,19,14]
newnums=[i for i in nums if i>=5]
newnums
实现方法三:filter()函数
nums = [2,3,4,10,9,11,19,14]
newnums=list(filter(lambda x:x>=5, nums))
newnums
#找出100内所有素数
ls = [];
for i in range(100):
if i < 2:
continue;
#难点:
#1.range(2,2) 返回空值,直接跳过循环,未执行break,else语句会被执行
#2.for.j循环执行完毕后,如果未找到满足i%j==0的数值,证明其是素数,break不会被执行,else会被执行;如果找到i%j==0的数值,证明其不是素数,break会被执行,else则不会被执行;
for j in range(2, i):
if i%j == 0:
#print("{0}不是素数".format(i));
break;
else:
#print("{0}是素数".format(i));
ls.append(i);
print(ls);
#求和
s = 0;
for k in ls:
s += k;
print(s);
#运行结果
#[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
#1060
把[x,y,z] [1,2,3]合并成[(x,1),(y,2),(z,3)]。我们可以使用for循环的方法来实现
list1 = ['x','y','z']
list2 = [1,2,3]
list_m = []
for i in range(len(list1)):
tuple_temp = (list1[i],list2[i])
list_m.append(tuple_temp)
print(list_m)
直接生成方式:
这里就要用到zip(打包)函数,它是python的一个内置函数,用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果使用dict方法,还可以生成字典,这个字典的键为第一个列表中的元素,值为第二个列表中的元素。
list1 = ['x','y','z']
list2 = [1,2,3]
list_m = list(zip(list1,list2))
list_d = dict(zip(list1,list2))
print(list_m)
print(list_d)
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
pop()方法语法:list.pop(obj=list[-1])
obj – 可选参数,要移除列表元素的对象。
返回值:该方法返回从列表中移除的元素对象。
实例
以下实例展示了 pop()函数的使用方法:
aList = [123, 'xyz', 'zara', 'abc'];
print "A List : ", aList.pop();
print "B List : ", aList.pop(2);
以上实例输出结果如下:
A List : abc
B List : zara
append()函数:Python列表append()方法用于将传入的对象附加(添加)到现有列表中。
语法:list.append(obj)
参数:obj - 这是要添加到列表中的对象。
返回值:此方法不返回任何值,但更新现有列表。
#!/usr/bin/python3
list1 = ['C++', 'Java', 'Python']
list1.append('C#')
print ("updated list : ", list1)
#运行结果
updated list : ['C++', 'Java', 'Python', 'C#']
# *_* coding:utf8 *_*
import tkinter
from functools import partial
# 按钮输入调用
def get_input(entry, argu):
# 从entry窗口展示中获取输入的内容
input_data = entry.get()
# 合法运算符 : + - * / -- ** // +-
# ------------ 输入合法性判断的优化 ------------
# 最后一个字符不是纯数字(已经有算数符号),原窗口值不为空,且输入值为运算符
# if not input_data[-1:].isdecimal() and (not argu.isdecimal()):
# if input_data[-2:] in ["--", "**", "//", "+-"]:
# return
# if (input_data[-1:] + argu) not in ["--", "**", "//", "+-"]:
# return
# ------------------------------------------------
# 出现连续+,则第二个+为无效输入,不做任何处理
if (input_data[-1:] == '+') and (argu == '+'):
return
# 出现连续+--,则第三个-为无效输入,不做任何处理
if (input_data[-2:] == '+-') and (argu == '-'):
return
# 窗口已经有--后面字符不能为+或-
if (input_data[-2:] == '--') and (argu in ['-', '+']):
return
# 窗口已经有 ** 后面字符不能为 * 或 /
if (input_data[-2:] == '**') and (argu in ['*', '/']):
return
# 输入合法将字符插入到entry窗口结尾
entry.insert("end", argu)
# 退格(撤销输入)
def backspace(entry):
input_len = len(entry.get())
# 删除entry窗口中最后的字符
entry.delete(input_len - 1)
# 清空entry内容(清空窗口)
def clear(entry):
entry.delete(0, "end")
# 计算
def calc(entry):
input_data = entry.get()
# 计算前判断输入内容是否为空;首字符不能为*/;*/不能连续出现3次;
if not input_data:
return
clear(entry)
# 异常捕获,在进行数据运算时如果出现异常进行相应处理
# noinspection PyBroadException
try:
# eval() 函数用来执行一个字符串表达式,并返回表达式的值;并将执行结果转换为字符串
output_data = str(eval(input_data))
except Exception:
# 将提示信息输出到窗口
entry.insert("end", "Calculation error")
else:
# 将计算结果显示在窗口中
if len(output_data) > 20:
entry.insert("end", "Value overflow")
else:
entry.insert("end", output_data)
if __name__ == '__main__':
root = tkinter.Tk()
root.title("Calculator")
# 框体大小可调性,分别表示x,y方向的可变性;
root.resizable(0, 0)
button_bg = 'orange'
math_sign_bg = 'DarkTurquoise'
cal_output_bg = 'YellowGreen'
button_active_bg = 'gray'
# justify:显示多行文本的时候, 设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER
# 文本从窗口左方开始显示,默认可以显示20个字符
# row:entry组件在网格中的横向位置
# column:entry组件在网格中的纵向位置
# columnspan:正常情况下,一个插件只占一个单元;可通过columnspan来合并一行中的多个相邻单元
entry = tkinter.Entry(root, justify="right", font=1)
entry.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
def place_button(text, func, func_params, bg=button_bg, **place_params):
# 偏函数partial,可以理解为定义了一个模板,后续的按钮在模板基础上进行修改或添加特性
# activebackground:按钮按下后显示颜place_params色
my_button = partial(tkinter.Button, root, bg=button_bg, padx=10, pady=3, activebackground=button_active_bg)
button = my_button(text=text, bg=bg, command=lambda: func(*func_params))
button.grid(**place_params)
# 文本输入类按钮
place_button('7', get_input, (entry, '7'), row=1, column=0, ipadx=5, pady=5)
place_button('8', get_input, (entry, '8'), row=1, column=1, ipadx=5, pady=5)
place_button('9', get_input, (entry, '9'), row=1, column=2, ipadx=5, pady=5)
place_button('4', get_input, (entry, '4'), row=2, column=0, ipadx=5, pady=5)
place_button('5', get_input, (entry, '5'), row=2, column=1, ipadx=5, pady=5)
place_button('6', get_input, (entry, '6'), row=2, column=2, ipadx=5, pady=5)
place_button('1', get_input, (entry, '1'), row=3, column=0, ipadx=5, pady=5)
place_button('2', get_input, (entry, '2'), row=3, column=1, ipadx=5, pady=5)
place_button('3', get_input, (entry, '3'), row=3, column=2, ipadx=5, pady=5)
place_button('0', get_input, (entry, '0'), row=4, column=0, padx=8, pady=5,
columnspan=2, sticky=tkinter.E + tkinter.W + tkinter.N + tkinter.S)
place_button('.', get_input, (entry, '.'), row=4, column=2, ipadx=7, padx=5, pady=5)
# 运算输入类按钮(只是背景色不同)
# 字符大小('+','-'宽度不一样,使用ipadx进行修正)
place_button('+', get_input, (entry, '+'), bg=math_sign_bg, row=1, column=3, ipadx=5, pady=5)
place_button('-', get_input, (entry, '-'), bg=math_sign_bg, row=2, column=3, ipadx=5, pady=5)
place_button('*', get_input, (entry, '*'), bg=math_sign_bg, row=3, column=3, ipadx=5, pady=5)
place_button('/', get_input, (entry, '/'), bg=math_sign_bg, row=4, column=3, ipadx=5, pady=5)
# 功能输入类按钮(背景色、触发功能不同)
place_button('<-', backspace, (entry,), row=5, column=0, ipadx=5, padx=5, pady=5)
place_button('C', clear, (entry,), row=5, column=1, pady=5, ipadx=5)
place_button('=', calc, (entry,), bg=cal_output_bg, row=5, column=2, ipadx=5, padx=5, pady=5,
columnspan=2, sticky=tkinter.E + tkinter.W + tkinter.N + tkinter.S)
root.mainloop()
from timeit import timeit
def count_append():
lists = []
for x in range(0, 100000):
lists.append(x)
cost_time = timeit(stmt=count_append, number=1)
print("append花费的时间是", cost_time)
def count_extend():
lists = []
for x in range(0, 100000):
list1 = [x]
lists.extend(list1)
cost_time = timeit(stmt=count_extend, number=1)
print("extend花费的时间为", cost_time)
def count_insert():
lists = []
for x in range(0, 100000):
lists.insert(x, x)
cost_time = timeit(stmt=count_insert, number=1)
print("insert花费的时间为", cost_time)
def count_plus():
lists = []
for x in range(0, 100000):
list1 = [x]
lists = lists+list1
cost_time = timeit(stmt=count_plus, number=1)
print("plus花费的时间为", cost_time)
append花费的时间是 0.008006025272567989
extend花费的时间为 0.010472806737249051
insert花费的时间为 0.012643240513279762
plus花费的时间为 13.00245008582025
由此可得append是耗时最短的