python学习(一)
python学习(一)
基础语法注意
- +只能拼接字符串和字符串,不能和非字符串拼接。
- %s占位符拼接非字符串,将内容转换成字符串,放入占位位置,多个变量要用变量括起来,单个变量不用括号。
class_num = 57
avg_salary = 14453
message = "python大数据学科:北京%s期,毕业平均薪资:%s" % (class_num, avg_salary)
print(message )
- %d将内容转换成整数,放入占位位置。
- %r将内容转换成浮点数,放入占位位置。
- 快速占位:f"{占位}" 其中占位可以是表达式如{1>2}。
name = "小小"
year = 17
print(f"我是{name},今年{year}岁")
- 输入语句 input()获取的是字符串 如果想转换成别的数据类型要另外转换。
name=input()name=input("请告诉我你是谁?")
- range(num1, num2,step) 不包含num2,步长为step(默认为1),num1默认为0。
- for循环外部可以访问到内部定义的临时变量。
- 列表list可以存储不同的数据类型,且可以嵌套(列表内再存一个列表)。
- 列表相关方法
#查找元素索引
mylist.index('num1')
#插入元素
mylist.insert(0,'num2')
#追加单个元素
mylist.append('num3')
#追加列表
mylist.extend(['num4','num5','num6']}
#删除元素
del mylist[0]
mylist.pop(p)
#remove方法从前到后搜索删除第一个指定元素
mylist.remove('num1')
#清空列表
mylist.clear()
#统计列表中指定元素的数量
mylist.count('num1')
- 元祖tuple是不可修改的列表,也可以存储不同数据类型。但可以修改元祖中的列表元素。
t1 = (1, ['hello','world'] true)
ti[1][1] = 'hello'
- 可以通过下标索引获得字符串某个位置元素值
str1 = 'red red red apple'
#replace将str1中的所有red替换成green 得到一个新的字符串对象
str2 = str1.replace('red', 'green')
#split将字符串分割成不同的元素并放入一个列表中
list1 = str2.split(" ")
#list1 = [ 'green', 'green', 'green', 'apple']
#去除首尾字符
str = "324124这是一个1234字符串314231”
str1 = str.strip("1234")
#str1 = 这是一个1234字符串
#.strip()去除开头和结尾的空格和换行
#strip从头和尾依次判断每个字符是否是参数中包含的字符,如果是就继续去除,否则就停止判断,和参数字符串顺序无关
- 序列是指内容连续、有序、可使用下标索引的一类数据容器。列表、元祖、字符串都是序列。
#列表的切片操作:序列[起始下标:结束下标:步长]得到一个新序列
#每隔步长-1个元素取一个元素
str="01234567"
str1 = str[::2]
#str1 = "0246"
str = "01234567"
str2 = str[::-1]
#str2 = "76543210" 步长为-1是从尾到头取相当于逆序
- 集合是不重复的、无序的,不支持索引访问。
set = {'red','blue','green'}
#添加新元素
set.add('black')
#移除元素
set.remove('red')
#随机取出元素,取出后集合中不再包含这个元素
element = str.pop()
#element = "green",str = {"blue","black"}
#取出集合的差集
set1 = {1,2,3}
set2 = {1,4,6}
set3 = set1.difference(set2)
#set3 = {2,3} 取集合1里有的集合2里没有的 同时原集合不发生变化
#消除2个集合的差集set1 = {1,2,3}
set2 = {1,4,6}
set1.difference_update(set2)
# set1 = {2,3} set2 = {1,4,6} 在集合1内删除和集合2相同的元素,集合2不变#合并集合得到新集合
set1 = {1,2,3}
set2 = {1,4,6}
set3 = set1.unior(set2)
#set3 = {1,,2,3,4,6} #集合不支持下标索引,因此只能通过for循环
15.字典是键值对的形式,不能通过下标访问,只能通过key访问value,key值不可重复。key和value都可以是任意数据类型,可以嵌套,但是key不可为字典。
dict = {"小明":88,"小红":99}
score = dict["小明"]
print(f"小明的成绩是:{score}")
#修改元素
dict["小明"] = 100
#新增元素
dict["小英"] = 0
#删除元素 获得指定key的value,同时在字典中删除该元素
#val = 0 dict = {"小明":88,"小红":99}
val = dict.pop("小英")
print(dict)#获取全部key keys = ["小明","小红"]
keys = dict.keys()
#遍历字典
for key in keys:print(f"字典的value是:{dict[key]}")for key in dict:print(f"字典的value是:{dict[key]}")dict = {"小明":{"语文":77,"数学":88,"英语":99},"小红":{"语文":65,"数学":97,"英语":99}}
score = dict["小明"]["语文"]
print(f"小明的语文成绩是:{score}")
- 数据容器通用函数max() 、min() 、sorted (序列,[reverse=true])降序排列 reverse=false升序排列、len()
- 函数可以有多个返回值
def test_return():return 1,"hello",truex, y, z = test_return()
- 函数的参数传递有位置传递和,传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组
#不定长--位置不定长
def user_info(*args):print(args)user_info("TOM")
user_info("TOM",18)#不定长--关键字不定长
def user_info(**kwargs):print(kwargs)user_info(name = "jerry".age = 11, gender = "男孩", addr = "北京")
- 函数作为参数传递
#计算逻辑由被传入函数决定
def test_func(compute):result = compute(1,2)print(result)def compute(x,y):return x+ytest_func(compute)#lambda匿名函数 lambda 传入参数:函数体(一行代码) 函数体只能有一行代码
def test_func(compute):result = compute(1,2)print(result)test_func(lambda x, y:x+y)
- 文件操作
- open(name,mode,encoding)打开函数
- read(num)读指定num字节数据或者读全部数据
- readlines()按行读取整个文件,每一行是一个元素,组成一个列表
- 读操作都有一个指针,每次读操作从上次读操作结束的位置开始读,不区分read()和readline()
#name = 文件路径
#mode = r(只读)/w(写入,如果文件存在,则打开文件从头编辑,原有内容会被删除;如果文件不存在,则创建新文件)/a(追加,如果文件存在,则新内容写在原有内容之后;如果文件不存在,创建新文件并写入)
#encoding = 编码格式
f = open("D:/test.txt",'r',UTF-8)
context = f.readlines()#for循环读取文件行
for line in open("D:/test.txt",'r',UTF-8)print(line)#对文件操作完要关闭文件
f.close()#with open操作后自动关闭文件,自带close()操作
with open("D:/test.txt","r") as f:f.readlines()
- write()读操作,内容并未真正写入文件,暂存入缓冲区,调用flush后才真正将内容写入文件,一次性写入磁盘。
f = open("D:/test.txt",'w',UTF-8)
f.write('hello jerry')
f.flush()
f.close()
- a模式,如果文件存在,则新内容写在原有内容之后;如果文件不存在,创建新文件并写入
f = open("D:/test.txt",'a',UTF-8)
#可以用\n写出换行符
f.write('\ntom is comming')
#写出文件调用close会自动flush
f.close()
- 异常- 捕获异常
#捕获多个异常
try:
# 1/0print(name)
except (NameError, ZeroDivisionError) as e:print("出现变量未定义 或 除以0的错误")#捕获所有异常
try:print(name)
except:
# except Exception as e:print("出现错误")
else:
#没有出现异常时怎么执行 可选print("没有出现异常")
finally:
#无论是否出现异常都执行 可选print("")
- 导入
#导入time模块使用sleep功能(函数)
import time
print("tom")
time.sleep(5)
print("Jerry")#使用from导入time模块的sleep功能(函数)
from time import sleep
print("tom")
time.sleep(5)
print("Jerry")#使用*导入time模块的全部功能
from time import *
print("tom")
time.sleep(5)
print("Jerry")
- 模块
- 模块内部使用if name == ‘main’:时,只有直接右击直接运行模板文件时__name == '__main__为真 才会运行条件下的内容。否则,导入模板时会自动运行模板文件的所有内容。
def test(a, b):print(a+b)if __name == '__main__':test(1,2)
- 模块内部使用__all__ == [‘testA’]时,import模块的*时,只会导入__all__的内容。
#from module import *时只会引入testA
__all__ == ['testA']
def testA(a, b):print(a+b)def testB(a, b):print(a-b)
- json数据 类似字典形式的键值对,也可以是元素是字典的列表
import json
#准备列表,列表内的每一个元素都是字典,将其转换为JSON
data = [{"name":"小红","age":1},{"name":"小明","age":2}]
json_str = json.dumps(data,ensure_aascii=false)
#准备字典,将字典转换为JSON
data1 = {"name":"tom","age":888}
json_str1 = json.dumps(data1)#将json还原为列表
data2 = '[{"name":"小红","age":1},{"name":"小明","age":2}]'
str2 = json.loads(data2)
print(type(str2))
#将json还原为字典
data3 = '{"name":"tom","age":888}'
str3 = json.loads(data3)
print(type(str3))
- pyecharts模块
- 简单折线图
#安装pyecharts模块
pip install pyecharts#构建基础折线图及相关配置
#导包,导入line功能构建折线图对象
from Pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
#得到折线图对象
line = Line()
#添加x轴数据
line.add_xaxis(["中国","美国","英国"])
#添加y轴数据
line.add_yaxis("GDP",[30,20,10])
#设置全局配置项
line.set_global_opts(
#设置标题title_opts = TitleOpts(title="GDP展示"), pos_left="center", pos_bottom="1%"),
#设置图例的显示legend_opts = LegendOpts(is_show = True),
#设置工具箱的显示toolbox_opts = ToolboxOpts(is_show = True),
#设置视觉映射的显示visualmap_opts = VisualMapOpts(is_show = True))
#生成图表
line.render()
- 简单折线图示例
import json
from Pyecharts.charts import Line
f_us = open("D:/美国.txt", "r", encoding="UTF-8)
us_data = f_us.read()
f_jp = open("D:/日本.txt", "r", encoding="UTF-8)
jp_data = f_jp.read()
f_in = open("D:/印度.txt", "r", encoding="UTF-8)
in_data = f_in.read()
#去掉不符合规范的json开头
us_data = us_data.replace("jsonp_21345456576_4263174(", "")
jp_data = jp_data.replace("jsonp_3545768766q_4125467(", "")
in_data = in_data.replace("jsonp_2234557668_985654(", "")
#去掉不符合规范的json结尾 用切片 从头取到倒数第二个但不包含倒数第二个自身
us_data = us_data.replace[ : -2]
jp_data = jp_data.replace[ : -2]
in_data = in_data.replace[ : -2]
#json转python字典
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)
#获取trend key
us_trend_data = us_dict['data'][0]['trend']
jp_trend_data = jp_dict['data'][0]['trend']
in_trend_data = in_dict['data'][0]['trend']
#获取日期数据,用于x轴,取到314下标结束
us_x_data = trend_data['updateDate'][: 314]
jp_x_data = trend_data['updateDate'][: 314]
in_x_data = trend_data['updateDate'][: 314]
#获取确认数据,用于y轴,取到315下标结束
us_y_data = trend_data['list'][0]['data']
jp_y_data = trend_data['list'][0]['data']
in_y_data = trend_data['list'][0]['data']line = Line()
line.add_xaxis(us_x_data)#x轴是公用的
line.add_yaxis("美国确诊人数",us_y_data)
line.add_yaxis("日本确诊人数",jp_y_data)
line.add_yaxis("印度确诊人数",in_y_data)
#调用render方法,生成折线图
line.render()
#关闭文件对象
f_us.close()
f_jp.close()
f_in.close()
- 地图构建
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
map = Map()
data = {("北京",99),("上海",199),("湖南",299),("台湾",399),("广东",499)
}
#配置地图 名称 数据 地图类型(默认中国地图)
map.add("测试地图",data, "China")
#设置全局选项
map.set_global_opts(visualmap_opts = VisualMapOpts(is_show = True,#手动设置范围is_piecewise = True,#列表内可以写入多个元素 写入几个元素表示指定几个范围 每个元素都是一个字典piece = [{"min":1,"max": 9,"label":"1-9","color":"#CCFFFF"},{"min":10,"max": 99,"label":"10-99","color":"#FF6666"},{"min":100,"max": 500,"label":"100-500","color":"#990033"},])
)
#绘图
map.render()
- 柱状图
from pyecharts.charts import Bar, TimeLine
from pyecharts.options import LabelOpts
#导入时间线主题
from pyecharts.globals import Theme
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
#反转x轴和y轴后 y轴的数据要在柱子的右侧显示
bar1.add_yaxis("GDP",[30,20,10],label_opts = LabelOpts(position = "right"))
#反转x轴和y轴--让柱状图横向展示
bar1.reversal_axis()bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
#反转x轴和y轴后 y轴的数据要在柱子的右侧显示
bar2.add_yaxis("GDP",[50,50,50],label_opts = LabelOpts(position = "right"))
#反转x轴和y轴--让柱状图横向展示
bar2.reversal_axis()bar3 = Bar()
bar3.add_xaxis(["中国","美国","英国"])
#反转x轴和y轴后 y轴的数据要在柱子的右侧显示
bar3.add_yaxis("GDP",[70,60,60],label_opts = LabelOpts(position = "right"))
#反转x轴和y轴--让柱状图横向展示
bar3.reversal_axis()#构建时间线对象 本质上是一个从左到右的X轴
timeline = TimeLine({"theme",ThemeType.LIGHT})
timeline.add(bar1,"点1")
timeline.add(bar2,"点2")
timeline.add(bar3,"点3")#时间线自动播放
timeline.add_schema(play_interval=1000,#自动播放的时间间隔is_timeline_show = True,#是否在自动播放时显示时间线is_auto_play = True,#是否自动播放is_loop_play = True#是否循环自动播放
)
#绘图是用时间线绘图
timeline.render("基础时间线柱状图.html")
- 排序方法 列表.sort(key=选择排序依据的函数,reverse-true/false)
- 参数key,要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
- 参数reverse,是否反转排序结果,true表示降序,false表示升序
list = [["a",33],["b",55],["c",11]]
#按照下标1的元素进行排序
#基于带名函数
def choose_sort_key(element):return element[1]
list.sort(key=choose_sort_key,reverse-true)
#基于匿名函数
list.sort(key=lambda element:element[1],reverse-true)
- 动态GDP表
from pyecharts.charts import Bar, TimeLine
from pyecharts.options import *
from pyecharts.globals import ThemeTypef = open("d:/数据.csv","r",encoding = "GB2312")
data_lines = f.readlines()
f.close()
data_dict = {}
for line in data_lines:year = int(line.split(",")[0])country = line.split(",")[1]dap = float(line.split(",")[2])try:data_dict[year].append([country, gdp])except KeyError:data_dict[year] = []data_dict[year].append([country, gdp])#创建时间线对象
timeline = TimeLine({"Theme":ThemeType.LIGHT})
#排序年份
sorted_year_list = sorted(data_dict.keys())
for year in sorted_year_list:data_dict[year].sort(key=lambda element:element[1],reverse-true)#取出本年份GDP排名前8的国家year_data = data_dict[year][0:8]x_data = []y_data = []for country_dgp in year_data:x_data.append(country_dgp[0])y_data.append(country_dgp[1] / 10000000)#构建柱状图bar = Bar()x_data.reverse()y_data.reverse()bar.add_xaxis(x_data)bar.add_yaxis("GDP(亿)"y_data,label_opts = LabelOpts(position = "right"))#反转x轴和y轴bar.reversal_axis()#设置每一年的图表标题bar.set_global_opts(title_opts = TitleOpts(title=f"{year}年全球前8GDP数据"))timeline.add(bar, str(year))#设置时间线自动播放
timeline.add_schema(play_interval=1000,#自动播放的时间间隔is_timeline_show = True,#是否在自动播放时显示时间线is_auto_play = True,#是否自动播放is_loop_play = True#是否循环自动播放
)
#绘图
timeline.render("1960-2019全球GDP前8国家.html")