《Python編程從入門到實踐》學習筆記

实际操作中给变量取的名字要可读性强,我这里给变量取的名字非常简短,只是为了方便理解。

第 1 章 起步

win+s 输入cmd检查python是否安装成功, 或者win+s ,输入IDLE也可以使用python(IDLE是Python自带的)。

python文本编辑器:Geany,subline text,vs code ,pycharm,jupyter notebook。但是Geany,subline text在配置上很容易出现问题,不建议使用。

在vs code中运行.py文件

打开vs code——新建文件——文件另存为——某文件夹——保存类型选成:Python——在文件中输入print("Hello world! My name is Shuntai Yu.")——调试——启动调试——python file

在cmd中运行.py文件

cd 到.py文件所在位置——输入.py文件名——enter

第 2 章 变量和简单数据类型

在Python中, 用引号括起的都是字符串, 其中的引号可以是单引号, 也可以是双引号

.title()、.upper()、.lower()、+、\t,\n、.rstrip()、.lstrip()、.strip()、str() 、

修改大小写

message="Hello! shuntai yu !"
print(message.title())   #使每个单词首字母大写
print(message.upper())   #所有字母都大写
print(message.lower())   #所有字母都小写

合并(拼接)

#合并(拼接) 字符串
first_name="shuntai"
last_name="yu"
full_name=first_name + " " + last_name
print("Hello" + " " + full_name.title() + " " + "!")   

添加空白和空白行

#制表符是\t,换行符是\n
print("python")
print("\npython")  #换行
print("\tpython")   #前面加一个空白

删除空白

tmp="   python  "
print(tmp.rstrip())   #删除尾空白
print(tmp.lstrip())   #删除头空白
print(tmp.strip())    #删除两端空白

非字符转换成字符

# str() 它让Python将非字符串值表示为字符串
age = 23
message = "Happy " + str(age) + "rd Birthday!"
print(message)

python之禅

import this   #python之禅

第 3 章 列表简介

Python 用[ ] 表示列表, 并用逗号来分隔元素。索引从0开始。
.append()、.insert()、del语句、.pop()、.remove()、.sort()、sorted()、.reverse()

提取元素

bicycles = ['trek', 'cannondale', 'redline', 'specialized','ducati']
print(bicycles[0])
print(bicycles[0].title())    #使首字母大写
print(bicycles[-1])   #索引为-1 表示倒数第一个列表元素,为-2为倒数第二个,依此类推。

更改,添加元素

bicycles[0] = 'ducati'     #将第1个元素改成ducati
print(bicycles)
bicycles.append('zzz')    #末尾附加元素
bicycles.insert(0, 'iii')       #指定索引和值插入新元素

删除元素

del bicycles[0]       #根据索引删除
popped_bircycle = bicycles.pop()      #删除最后一个元素
print(bicycles)
print(popped_bicycle)       #访问被删除的值
bicycles.pop(1)       #指定索引获取任意元素
bicycles.remove('ducati')      #根据元素删除

排序和确定元素个数

cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()      #sort() 对列表进行永久性排序,变成cars.sort(reverse=True)则反向永久排序
print(cars)
print(sorted(cars))     #sorted() 对列表进行临时排序,也可传递参数reverse=True
print(cars)
cars.reverse()    #永久反转排列顺序,使用两次可回到原顺序
print(cars)
len(cars)       #确定列表元素个数

第4 章 操作列表

for循环、range()、enumerate()

tmp = [12,13,33,45,45,67,33,22,98]
foo = enumerate(tmp)   # enumerate可以获取每个元素的索引和值
for id,bd in foo:
    print(id,bd)   #将会得到每个元素的索引和值

for循环

注意:缩进,冒号,[:]

foo = ['AAA', 'BBB', 'CCC']
for id in foo:    #所谓遍历整个列表就是对列表中的每个元素执行相同的操作
    print(id)

缩进

属于循环部分的代码要缩进,循环外部代码不缩进

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician.title() + ", that was a great trick!")
    print("I can't wait to see your next trick, " + magician.title() + ".\n")   #缩进则每循环一次就执行一次,不缩进则只在循环结束时执行一次。
for id in range(1,5):
    print(id)

for id in range(1,11,2):    #2为步长
    print(id)
foo = list(range(1,5))
print(foo)

数字列表创建、运算、解析

foo = []   #创建空list
for id in range(1,11):
    arg = id**2
    foo.append(arg)     #要熟系.append的用法,foo.append(arg) 表示将arg的值追加到foo后面,for循环遍历每一个值,对每一个值求平方,将平方值追加到list里面。
print(foo)
sum(foo)   #求和,若是min或者max则为求最小值,最大值

#与上同
tmp=[]
for id in range(1,11):
    tmp.append(id**2)   #可直接将平方追加到list
print(tmp)

#列表解析
foo=[id**2 for id in range(1,11)]
print(foo)

切片和复制列表

tmp = ['charles', 'martina', 'michael', 'florence', 'eli']
print(tmp[0:3])   #第1到第3个元素;[:3]也表示第1到第3个元素;[3:]表示第3到最后一个元素;[-2:]表示最后两个元素
foo=tmp[:]   #复制列表,此时foo是tmp的拷贝
print(foo)

foo=tmp   #这样是不行的
print(foo)
tmp.append("AAA")
print(tmp)
print(foo)  #在tmp后面追加同样会出现在foo里面,因为foo=tmp将两个变量指向了同一个列

#通过for循环遍历切片
for id in tmp[0:3]:
    print(id.title())

元组

不可变的列表称为元组 。虽然元组变量元素不能修改,但是可以给变量重新赋值。

tmp=(200,50)
print(tmp[0])  #通过索引号访问元组元素
print(tmp[1])

tmp[0]=111   #会报错,因为元组元素不可更改

tmp=(111,50)    #给变量重新赋值
print(tmp)

第 5 章 if 语句

==、!=、>=、<=、>、<、and、or、

判断比较和检查

tmp=["audi","bmw","subaru","toyota"]
for id in tmp:
    if id=='audi':    #注意这里有冒号
        print(id.title())
    else:                #注意这里有冒号
        print(id.upper())

'audi' in tmp    #检查某个值是否包含在列表中,会返回TRUE和FALSE; 若是 'audi' not in tmp   则检查某个值是否不包含在列表中

if 'aaa' not in tmp:
    print("不包含!")
car = 'bmw'
if car == 'bmw':   #通过==判断是否相等,!=判断是否不等,
    print("干得好!")

检查多个条件

使用and 和or检查多个条件

age_0 = 22
age_1 = 18
age_0 >= 21 and age_1 >= 21    #等价于(age_0 >= 21) and (age_1 >= 21),加上括号提高可读性

if-else

tmp=17
if tmp >=18:
    print("条件成立!")
else:    # 在 IDLE 里该句最靠左边
    print("条件不成立!")

if-elif-else

tmp=27
if tmp <= 4:
    print("tmp不大于4")
elif tmp < 18:
    print("tmp介于4和18之间")
else:
    print("tmp大于等于18")

#可以有多个elif
age = 12
if age < 4:
    price = 0
elif age < 18:
    price = 5
elif age < 65:
    price = 10
else:     # Python不要求if-elif 结构后面必须有else 代码块,故该句可改成elif age >=65: 
    price = 5
print("Your admission cost is $" + str(price) + ".")

for循环里用if 和 if里面用for循环

tmp = ['mushrooms', 'green peppers', 'extra cheese']
for id in tmp:
    if id == 'green peppers':
        print("Sorry, we are out of green peppers right now.")
    else:
        print("Adding " + id + ".")
print("\nFinished making your pizza!")

确定列表非空

在if 语句中将列表名用在条件表达式中时, 列表非空时返回True ,空列表返回False。

tmp=[]
if tmp:     #因为tmp是空列表,所以返回False,执行else
    if 'aaa' in tmp:
        print("aaa在里面")
else:
    print("这他妈是个空的!")

确定一个列表中的元素是否存在于另一个列表

tmp = ['mushrooms', 'olives', 'green peppers',
'pepperoni', 'pineapple', 'extra cheese']
foo = ['mushrooms', 'french fries', 'extra cheese']
for id in foo:
    if id in tmp:
        print("Adding " + id + ".")
    else:
        print("Sorry, we don't have " + id + ".")
        print("\nFinished making your pizza!")

第6章 字典

列表是[],元组是(),字典是{}

tmp = {'color': 'green', 'points': 5}    #字典中存储的是键-值对,这个字典存储了两个键-值对。
print(tmp['color'])
print(tmp['points'])

创建、填充、访问、添加、修改、删除、遍历

tmp = {}    #创建空字典
tmp['color'] = 'green'   #填充空字典,[ ]里面是键,=右边是值
tmp['points'] = 5
print(tmp)    # tmp = {'color': 'green', 'points': 5}

print(tmp['points'])  # 访问字典中的值

tmp['bar'] = 0   #添加键-值对。键-值对在字典中的排列顺序不重要,但是键和值的对应关系重要
print(tmp)

tmp['color'] = 'yellow'  #修改字典中的值
print(tmp)

del tmp['bar']  #删除键值对
print(tmp)

#遍历字典中所有键、值、键值对
for id,foo in tmp.items():    # for 键变量,值变量 in 字典.items():    ##遍历键值对的方式。   
    print("\nid:" + id)
    print("foo:" + str(foo))  #若字典的值没有数字,foo这里不需要写str

for id in tmp.keys():    # 遍历键是将items换成keys;将tmp.keys()改成set(tmp.keys())可以去除重复,将set换成sorted可以排序。
    print(id.title())

for id in tmp.values():    # 遍历值是将items换成values
    print(str(id).title())  

嵌套

在列表中嵌套字典

alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
aliens = [alien_0, alien_1, alien_2]
for id in aliens:
    print(id)

在字典中嵌套列表

当需要在字典中将一个键关联到多个值时, 可以在字典中嵌套一个列表。

alien = {'color': ['green', 'yellow', 'red'], 'points': [5,10,15]}   
for id in alien['color']:
  print(id)

在字典中嵌套字典

字典中嵌套字典要注意四个逗号,结构是 {键:{键:值,},键:{键:值,},}

users = {
'aeinstein': {
'first': 'albert',
'last': 'einstein',
'location': 'princeton',    #注意这里的逗号
},    #注意这里的逗号
'mcurie': {
'first': 'marie',
'last': 'curie',
'location': 'paris',   #注意这里的逗号
},    #注意这里的逗号
}

for id,foo in users.items():
    print("\nUsername:" + " " +id)
    print("\tFull name:" + " " + foo['first'].title() + " " + foo['last'].title())
    print("\tLocation:" + " " + foo['location'].title())

第7章 用户输入和while 循环

input()

函数input() 可暂停程序,显示input()中的提示,等待用户输入。 可将用户输入存储在一个变量中,然后使用输入。

>>> id = input("Tell me your name: ")    #等待用户输入文本,将其存储在变量中。
Tell me your name:Shuntai Yu
>>> print(id + " " + "is very hansome!")    #使用输入
Shuntai Yu is very hansome!

同上
>>> tmp = "Tell me your name: "
>>> id = input(tmp)
Tell me your name: Shuntai Yu
>>> print(id + " " + "is very hansome!")
Shuntai Yu is very hansome!

#在提示中添加内容
>>> tmp = "Tell me your name"
>>> tmp += ",please! :"   # +=可以在提示中添加新的内容。
>>> id = input(tmp)
Tell me your name,please! :Shuntai Yu
>>> print(id + " " + "is very hansome!")
Shuntai Yu is very hansome!

int()

python会将用户输入看做字符串,使用int()可以获得数值

>>> age = input("How old are you? ")
How old are you? 21   
>>> age >= 18     #上面输入的数字会被认作字符串,所以这里会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>=' not supported between instances of 'str' and 'int'
>>> age = int(age)    #转成数值
>>> age >= 18    #数值可以进行判断
True

%

%将两个数相除并返回余数:

>>> 4 % 3
1

while循环

一个思想很重要:while就是判断,若为逻辑运算则while后面的为True,就继续执行;若后面是列表字之类的,则非空就继续执行。所以while id就是判断id的逻辑值。

>>> id = 1
>>> while id <= 5:   #while就是判断,while后面的为id <= 5,若为True就继续执行
...     print(id)   # 我是用的IDLE,注意该句前面tab键
...     id += 1    #该句等于 id = id + 1
...
1
2
3
4
5
>>> id = True
>>> while id:    # #while就是判断,while后面的为id,而id = True,所以会继续执行下面的代码。
    print("Hello!")
        break    #若此处不break,则会产生无限循环。
#该例子没有停止运行while循环,所以会不停执行下去。终止它使用Ctrl + C。
id = False
while id ==False:
    print("Hello!")

    
Hello!
Hello!
Hello!
  .
  .
  .
tmp = ['a', 'b', 'c']
while tmp:   # tmp为非空列表,故后面可以继续执行。
    print('hello')
    break

让用户选择何时退出

prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "    # 我的理解:这个+=可以理解为对上面定义的补充,因为上面已经对prompt进行了定义,这里表示再对定义进行追加内容。
message = ""  
while message != 'quit':  #若无可供比较的东西,程序无法继续运行,所以上面给message赋了空字符串。 
    message = input(prompt)
    print(message)

#如果没有可供比较的东西, Python将无法继续运行程序。 为解决这个问题, 我们必须给变量message 指定一个初始值。 虽然这个初始值只是一个空字符串, 但符合要求, 让Python能够执行while 循环所需的比较。 只要message 的值不是'quit' , 这个循环就不断运行。首次遇到该循环时,message 是空字符串, 因此进入循环。 

#下面这个也可以实现上面的效果
tmp = "\nTell me something, and I will repeat it back to you:"
tmp += "\nEnter 'quit' to end the program."
id = ''
while id != 'quit':
    id=input(tmp)

#下面这个也可以实现上面的效果
tmp='\nTell me something, and I will repeat it back to you:'
foo="Enter 'quit' to end the program."
id=''
while id !='quit':
    print(tmp)
    id=input(foo)

#比较一下这三种实现方法。

标志

标志是程序的交通信号灯。 可以让程序在标志为True 时继续运行(当然也可以为False时继续运行,自己设置),这样, 在while 语句中只需检查标志的当前值是否为True ,并将所有测试都放在其他地方, 从而让程序更整洁。

prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
id = True
while id:
    message = input(prompt)
    if message == 'quit':
        id = False
    else:
        print(message)

break 和 continue

break不再执行余下的代码,直接跳出循环。
continue忽略余下的代码,返回到循环开头。

>>> id = True
>>> while id:    #以while True 打头的循环将不断运行, 直到遇到break 语句。 
    print("Hello!")
        break
    
Hello!
#从1数到10只打印奇数
id = 0
while id < 10:
    id += 1
    if id % 2 == 0:
        continue   # continue忽略剩下的代码,返回到循环开头。
        
    print(id)

使用while 循环来处理列表和字典

列表之间移动元素

只是遍历列表可使用for循环while循环
在遍历列表的同时又要对其进行修改,使用while 循环,不能用for循环。 通过将while 循环同列表和字典结合起来使用, 可收集、 存储并组织大量输入, 供以后查看和显示。

亲手打一下下面的例子!

# 首先,分别创建一个非空列表和空列表,将非空列表中处理后的元素移到空列表中。
tmp = ['alice', 'brian', 'candace']
foo = []

# 处理tmp中每个元素,并将处理过的元素移到foo中
while tmp:
    arg = tmp.pop()
    print("Verifying user: " + arg.title())   #这里的处理就是首写字母变成大写
    foo.append(arg)

# 显示处理过的元素
print("\nconfirmed users:")
for arg in foo:
    print(arg.title())
pets = ['cat','cat','cat','dog','dog','dog','rabbit']
print(pets)
pets.remove('cat')   # .remove() 只能一次删除一个,想将pets里面的‘cat’全部删除需要使用循环。
print(pets)

while 'cat' in pets:   # 使用循环可全部删除
    pets.remove('cat')
print(pets)

使用用户输入填充字典

实现如下
What is your name? Eric
Which mountain would you like to climb someday? Denali
Would you like to let another person respond? (yes/ no) yes
What is your name? Lynn
Which mountain would you like to climb someday? Devil's Thumb
Would you like to let another person respond? (yes/ no) no
--- Poll Results ---
Lynn would like to climb Devil's Thumb.
Eric would like to climb Denali.

方法一:

responses = {}
polling_active = True  # 设置一个标志, 指出调查是否继续
while polling_active:
    name = input("\nWhat is your name? ")
    response = input("Which mountain would you like to climb someday? ")
    responses[name] = response  # 将用户输入填充进字典
    repeat = input("Would you like to let another person respond? (yes/ no) ")
   
    if repeat == 'no':   # 通过if来实现以用户输入来决定是否结束while循环
        polling_active = False   

print("\n--- Poll Results ---")
for name, response in responses.items():
    print(name + " would like to climb " + response + ".")

方法二:

tmp = {}
name = input("what is your name? ")
mou = input("which mountain would you like to climb someday? ")
tmp[name] = mou
foo = input("Would you like to let another person respond? (yes/ no) ")
while foo =='yes':
    name = input("what is your name? ")
    mou = input("which mountain would you like to climb someday? ")
    tmp[name] = mou
    foo = input("Would you like to let another person respond? (yes/ no) ")

print("\n---poll results---")
for id,arg in tmp.items():
    print(id + " would like to climb " + arg)

第8章 函数

定义函数

定义函数使用def,def是指definition的缩写

def 函数名(形参):     #即使没有形参,()也不可少; 若多个形参,则用,间隔;
  函数要执行的任务
def funct(id,fib,arg="rabbit"):    # id和fib和arg是三个形参,即函数完成工作所需要的信息。并且形参可以指定默认值,arg就指定了默认值。
    print("\nI have a " + id + ".")
    print("My " + id + "'s name is " + fib.title() + ".")
    print("My " + arg + "'s name is Jack .")

funct('dog', 'Lily')   #  'dog'和 'Lily'是实参,即调用函数时传递给函数的信息,这种是位置实参,要求顺序和形参一致。arg没有新赋值,则使用默认值。
funct('dog', 'Lily','cat')   #arg新赋值为'cat'所以弃默认值,使用新赋值。
funct(fib = 'Lily',id = 'dog', arg="cat")   #这种是关键字实参,因为指定了形参名,所以不需要顺序一致。且对arg赋了新值,故使用新值。

# 位置实参、关键字实参和默认值可以混合使用

返回值

def funct(id,foo):
    arg = id + ' ' + foo
    return arg.title()    # 函数中使用return将值返回到函数调用行

fib = funct('shuntai', 'yu')    # 存储返回值需要提供变量
print(fib)


#函数可返回任何类型的值
def funct(first_name, last_name):
    person = {'first': first_name, 'last': last_name}
    return person    #返回的是字典
musician = funct('jimi', 'hendrix')
print(musician)

让实参变成可选

def funct(first_name, middle_name, last_name):
    full_name = first_name + ' ' + middle_name + ' ' + last_name
    return full_name.title()

musician = funct('john', 'lee', 'hooker')
print(musician)

上面的例子适用于有中间名的名字,但不是所有人都有中间名,所以要让中间名的实参变得可选

def funct(first_name, last_name, middle_name=''):   #先将中间名变成空字符串
    if middle_name:     # 进行判断,若中间名非空,后续执行;若中间名为空则执行else。
        full_name = first_name + ' ' + middle_name + ' ' + last_name
    else:
        full_name = first_name + ' ' + last_name
    return full_name.title()
musician = funct('jimi', 'hendrix')
print(musician)
musician = funct('john', 'hooker', 'lee')
print(musician)

结合使用函数和while循环

实现如下效果:
Please tell me your name:
enter 'q' at any time to quit
First name: eric
Last name: matthes

Hello, Eric Matthes

Please tell me your name:
enter 'q' at any time to quit
First name: q

方法1:

def funct(First_name,Last_name):
    tmp = "\n" + "Hello, " + First_name + " " + Last_name + "!\n"
    return tmp.title()

while True:
    print("Please tell me your name:")
    print("(" + "enter 'q' at any time to quit" + ")")
    f_name = input("First name: ")
    if f_name == 'q':
        break
    l_name = input("Last name: ")
    if l_name == 'q':
        break
    foo = funct(f_name,l_name)
    print(foo)

方法2:

def funct(first_name,last_name):
    print("\nHello, " + f_name.title() + " " + l_name.title() + "!\n")

while True:
    print("Please tell me your name:")
    print("(" + "enter 'q' at any time to quit" + ")" )
    f_name = input("First name: ")
    if f_name =='q':
        break
        
    l_name = input("Last name: ")
    if l_name =='q':
        break
        
    funct(f_name,l_name)

第7章 使用while 循环来处理列表和字典 那一个例子可以定义两个函数

tmp = ['alice', 'brian', 'candace']
foo = []

def funct_1(tmp,foo):    #定义第一个函数
    while tmp:
        arg = tmp.pop()
        print("Verifying user: " + arg.title())   #这里的处理就是首写字母变成大写
        foo.append(arg)

def funct_2(foo):    #定义第二个函数
    print("\nconfirmed users:")
    for arg in foo:
        print(arg.title())
        
funct_1(tmp,foo)    # 这个函数运行之后,tmp会变成空列表,若不想如此,则可以用tmp[:]替换tmp,即用tmp的副本作为函数的实参。
funct_2(foo)

print(tmp)  # 可以看到tmp变空了
print(foo)   #可以看到foo变满了

传递任意数量的实参

一个 * 创建空元组,两个 * 创建空字典。

空元组

在形参名前面加 * 可以创建一个空元组,该空元组可以将接收到的所有值都封装到这个元组中。

def funct(*foo):
    print(foo)
    
funct('aaa')
funct('aaa', 'bbb', 'ccc')

当函数接受不同类型的实参,则星号实参要放在最后。python会先匹配位置实参和关键字实参,再将剩下的实参都收集进最后一个形参中。

def funct(size,*foo):
    print("Making a " + str(size) + "-inch pizza with the following topppings:")     # 数字要通过str() 转换
    for id in foo:
        print("-" + id)

funct(2,'aaa')
funct(5,'aaa', 'bbb', 'ccc')   #先匹配位置实参5,再将剩下的实参都收集进最后一个形参中。

空字典

有时候, 需要接受任意数量的实参, 但预先不知道传递给函数的会是什么样的信息。 在这种情况下, 可创建空字典。

def build_profile(first, last, **user_info):    # 两个星号创建一个名为user_info 的空字典, 并将收到的所有名称—值对都封装到这个字典中。 

#创建字典并将非星实参填充进字典    
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    
    for key, value in user_info.items():   #遍历星号实参键-值对
        profile[key] = value    # 也填充进同一字典
    return profile    #将非星实参和星号实参填充好的字典返回给函数调用行

user_profile = build_profile('albert', 'einstein',
                             location='princeton',
                             field='physics')
print(user_profile)

#调用这个函数时, 不管额外提供了多少个键—值对, 它都能正确地处理。

将函数存储在模块

类似于shell中的创建函数库。只需编写一条import 语句并在其中指定模块名, 就可在程序中使用该模块中的所有函数。

例子1

下面这个例子使用jupyter无法展示,可用vs code。

创建模块

创建一个 .py 为后缀的文件,可在该文件中定义很多函数,该文件称为模块
pizza.py

def funct(size, *toppings):
    print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)

读取模块

读取模块则调用函数时需要带上模块名,读取模块中函数则调用函数时不需要带上模块名。

pizza.py文件同一目录下新建making_pizzas.py文件

读取所有函数

making_pizzas.py

import pizza   # 读取模块,此时模块中所有函数都可调用。读取方法:  import 模块名
#import pizza as pp   # 可以给模块指定别名,若这里指定别名,下面也要改

pizza.funct(16, 'pepperoni')   # 调用模块中的函数,需要带上模块名,方法:  模块名.函数名() 
pizza.funct(12, 'mushrooms', 'green peppers', 'extra cheese')
读取特定函数
from pizza import funct    # 读取模块中特定函数
from pizza import *    # 读取模块中所有函数,下面调用函数时也不用带上模块名。但这种方法极不推荐,可能会导致灾难性后果。
#from pizza import funct as tmp    # 当函数名太长或者与当前程序中的一些变量名冲突时则使用as为函数指定别名,这里指定funct的别名为tmp

funct(16, 'pepperoni')   # 调用模块中的函数不需要带上模块名,方法:  模块名.函数名()    #若上面为别名,这里也要为别名
funct(12, 'mushrooms', 'green peppers', 'extra cheese')

第9章 类

编写类时, 定义一大类对象都有的通用行为。 基于类创建对象时, 每个对象都自动具备这种通用行为, 然后可根据需要赋予每个对象独特的个性。 根据类来创建对象被称为实例化,这让你可以使用类的实例。

9.1创建和使用类

#创建一个表示小狗的类Dog (它表示的不是特定的小狗,而是小狗这一类)
# Dog类包含 名字和年龄 + 蹲下和打滚。
#然后通过编写好的类去创建特定小狗的实例。
#创建Dog实例时,通过实参向Dog()传递名字和年龄,self会自动传递。
#类中的函数称为方法

class Dog():    # 定义类: class 类名(首字母大写)():

    def __init__(self, name, age):   #定义名字和年龄。 注意init开头和末尾各两个下划线。 形参self一定要有,并且要在其它形参前面。  __init__接受形参的值,并将它们存储在根据该类创建的实例属性中。
        self.name = name    # (鄙人愚见:通过添加self前缀将对应的实参加进属性,这里可以改成self.tmp = name,但是后面使用self.name的地方要对应为self.tmp,对应的都是形参name,只不过在属性中一个命名为了name,一个命名为了tmp,类中其它方法使用时后续调用)。以self为前缀的变量可以供类中所有方法使用。 这一步目的是获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。
        self.age = age    #也可改成 self.foo = age,但是后续调用时要使用self.foo而不能再使用self.age

    def sit(self):     #定义蹲下,只有形参self,则后面创建的实例都能访问该方法
        print(self.name.title() + " is now sitting.")

    def roll_over(self):     #定义打滚
        print(self.name.title() + " rolled over!")
            
        
#创建实例

#访问属性和调用方法的办法就是: 实例名.属性名/方法名()

## 访问属性
### 访问属性的办法:  实例名.属性名
my_dog = Dog('willie',6)  # 使用前面编写好的Dog类创建实例,取名为my_dog;让python创建一个名字为Willie,年龄为6的小狗,self不需要给
print("My dog's name is " + my_dog.name.title() + ".")    #句点法访问属性
print("My dog is " + str(my_dog.age) + " years old.")

your_dog = Dog('lucy', 3)  #可以创建多个实例,这是另一个实例
print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")     


## 调用方法(使用句点法调用类中定义的任何方法(函数))
### 调用方法的办法:  实例名.方法名
my_dog.sit()
my_dog.roll_over()

your_dog.sit()
your_dog.roll_over()   

9.2使用类和实例


class Car():

    def __init__(self, make, model, year):    #方法__init__() 接受这些形参的值, 并将它们存储在根据这个类创建的实例的属性中。 
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0   # 也可以给属性指定默认值,此时形参当中不需要包括它。
    
    def get_descriptive_name(self):
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()
    
    
    #添加一个方法用于读取汽车里程表
    def read_odometer(self):   
        """打印一条指出汽车里程的消息"""    #函数中两个双引号引起来,是注释,不会执行。
        print("This car has " + str(self.odometer_reading) + " miles on it.") 

#################################### 代码1 #######################################

#以上部分代码简称 代码1,下面会用到。

                
my_new_car = Car('audi', 'a4', 2016)   #创建实例 my_new_car; 给出三个实参,self不用给。
print(my_new_car.get_descriptive_name())   #访问属性

my_new_car.read_odometer()    #调用方法

9.2.3修改属性的值

直接修改

# 代码1
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

通过方法修改

(即通过定义新的函数修改)

# 代码1             
    def update_odometer(self, mileage):
        self.odometer_reading = mileage   # 此处直接接受参数
        
my_new_car = Car('audi', 'a4', 2016)         
my_new_car.update_odometer(23)    # 通过向新定义的方法 update_odometer传递参数来修改
my_new_car.read_odometer()

# 通过在方法 update_odometer 里面添加 if 来禁止往回调里程表读数
# 代码1             
    def update_odometer(self, mileage):
        if mileage >= self.odometer_reading:   #前面是直接接收参数,这里改一下,使接收时进行一下判断。
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
        
my_new_car = Car('audi', 'a4', 2016)         
my_new_car.update_odometer(23)
my_new_car.read_odometer()

9.3 继承

继承五步骤:
1)括号中指定父类名称
2)初始化父类属性
3)super()关联父子
4)添加新属性
5)添加描述新属性的方法

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
            
    def get_descriptive_name(self):
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        print("This car has " + str(self.odometer_reading) + " miles on it.")

    def update_odometer(self, mileage):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
        
    def increment_odometer(self, miles):
        self.odometer_reading += miles

        
#继承五步骤     
class ElectricCar(Car):  #步骤1:括号中指定父类名称     
    def __init__(self, make, model, year):  #步骤2:初始化父类属性  
        super().__init__(make, model, year)  #步骤3:super()关联父子
        self.battery_size = 70    #步骤4:添加新属性
   
    def describe_battery(self): #步骤5:添加描述新属性的方法
        print("This car has a " + str(self.battery_size) + "-kWh battery.")

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

9.3.4重写父类的方法 和 9.3.5将实例用作属性看书

第10章 文件和异常

读取文件

文件名为 pi_digits.txt,文件的保存路径为D:\python_work\text_files,文件内容如下

3.1415926535
8979323846
2643383279

file_path = 'D:/python_work/text_files/pi_digits.txt'    #指定绝对路径,但是要将\换成/
with open(file_path) as file_object:    # with open as结构; with可以在不需要访问文件后将其关闭; open(文件名) 可以打开文件
    contents = file_object.read()    # 方法read()读取该文件全部内容并存储在contents中
    print(contents.rstrip())    #打印。 不加 .rstrip()发现会有一个空行,加了之后可以删除字符串末尾的空白

#open()是函数,read()是方法。

遍历

file_path = 'D:/python_work/text_files/pi_digits.txt'
with open(file_path) as file_object:    
    for id in file_object:
        print(id.rstrip())    # 如果是用print(id)则每一行下会有一个空行,用.rstrip()可以去除空行。


# 同上
file_path = 'D:/python_work/text_files/pi_digits.txt'
with open(file_path) as file_object:
    lines = file_object.readlines()
    for id in lines:
        print(id.rstrip())    
file_path = 'D:/python_work/text_files/pi_digits.txt'

with open(file_path) as file_object:
    lines = file_object.readlines()
    pi_string = ''

    for id in lines:
        pi_string += id.rstrip()

    print(pi_string)
    print(pi_string[:9] + "...")    # 指定显示的字符数
    print(len(pi_string))

tmp = input("Please enter your number: ")
if tmp in pi_string:
    print("Yes!")
else:
    print("No!")

写入文件

tmp = "programming.txt"

with open(tmp, 'w') as id:    # open有3个实参,r(读取)、w(写入)、a(附加);若省略实参,则默认为读取。换成r和a试一下,以w模式打开文件一定小心,若文件本身有内容,则会被清空。
    id.write("I love programming.\n")   # 换行符可以换行
    id.write("I love creating new games.")    # 写入多句则多次使用 .write()

异常

print(5/0)  # 会发生报错,显示Traceback

使用try-except,当try无异常则执行try下的,跳过except;若异常与except后的异常匹配,则继续运行

try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divyexcee by zero!")

实现如下效果:
Give me two numbers, and I'll divide them.
Enter 'q' to quit.
First number: 5
Second number: 0
You can't divide by 0!
First number: 5
Second number: 2
2.5
First number: q

print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
    first_number = input("\nFirst number: ")
    if first_number == 'q':
        break
    second_number = input("Second number: ")
    try:
        answer = int(first_number) / int(second_number)    # 可能引发异常的代码放try里面
    except ZeroDivisionError:    #except 代码块告诉Python, 如果它尝试运行try 代码块中的代码时引发了指定的异常, 该怎么办。
        print("You can't divide by 0!")
    else:    # 若try代码成功执行,则执行else
        print(answer)

# 下面这个是错的,想想错在哪里了?很有趣!
print("Give me two numcers, and I'll divide them.")
print("Enter 'q' to quit.")

while True:
    f_number = input("First number: ")
    if f_number == 'q':
        break

    s_number = input("Second number: ")


    answer = int(f_number)/int(s_number)
    try:
        print(answer)
    except ZeroDivisionError:
        print("You can't divide by 0!")

#可能引发异常的代码才需要放在try语句中 answer = int(first_number) / int(second_number)可能异常

文本统计字数

def funct(file_name):
    try:
        with open(file_name, 'r') as tmp:   # with open as结构
            foo = tmp.read()    # 方法read()读取该文件全部内容并存储在foo中
    except FileNotFoundError:
        print(file_name + " does not exist!")    # 若这里改成 pass 则失败时一声不吭,不显示任何消息。
    else:    
        fib = foo.split()    # split()以空格为分隔符将字符串拆分,并存储进一个列表
        num_words = len(fib)
        print("The file " + file_name + " has about " + str(num_words) + " words.")

filename = ["pi_digits.txt","pi_million_didits.txt","programming.txt"]    # 通过for循环遍历文件名
for id in filename:
    funct(id)

10.4 存储数据

json.dump() 和 json.load()

三步骤

  1. 导模
  2. with open as
  3. json.dump() / json.load() 。json.dump() 接受两个实参,要被存储的数据和可用于存储的文件对象,json.load()接受一个实参,即要读取的对象。注意一点,不管是dump还是load都需要的是对象!也就是as后面那个东西,别写错了。

json.dump()是进行存储

import json    #导入模块json
numbers = [2, 3, 5, 7, 11, 13]

#filename = 'tmp.json'    # tmp.json只是随便取的名字

with open('tmp.json', 'w') as foo:    # 以w模式打开tmp.json文件(json此时可以将数据写入, tmp.json只是随便取的名字),然后生成一个可用于存储数据的文件对象,并将该对象取名为 foo
    json.dump(numbers,foo)    # json.dump() 将numbers写入foo中

**json.load() **是进行读取

import json

with open('tmp.json','r') as foo:   # 以r模式打开tmp.json文件
    arg = json.load(foo)    #不管是dump还是load都需要的是对象!也就是as后面那个东西,别写错了。


print(arg)

写代码实现如下功能:
若以前存储了用户名就加载它,否则提示用户输入用户名并存储它。

import json
filename = 'name.json'
try:
    with open(filename) as f_obj:
        username = json.load(f_obj)   #不管是dump还是load都需要的是对象!也就是as后面那个东西,别写错了。
except FileNotFoundError:
    arg = input("what is your name: ")
    with open(filename,'w') as f_obj:
        json.dump(arg,f_obj)   # 不管是dump还是load都需要的是对象!也就是as后面那个东西,别写错了。
        print("we will remember you when you come back " + arg)
else:
    print("welcome back " + username)
    

10.43的重构看书

第11章 测试代码

使用Python模块unittest 中的工具来测试代码。
单元测试框架

测试函数

name_function.py

def funct(firstname,lastname):   #定义一个方法
    fullname = firstname + ' ' + lastname
    return fullname.title()

names.py

from name_function import funct    #从文件中导入方法
print("Enter 'q' at any time to quit.")
while True:
    firstname = input("Please give me a firstname: ")
    if firstname == 'q':
        break
    lastname = input("Please give me a lastname: ")
    if lastname == 'q':
        break
    fullname = funct(firstname,lastname)
    print(" \tNeatly formatted name: " + fullname + '.')

测试类

第15章 生成数据

matplotlib安装

win + s   # 打开 cmd 命令行窗口

pip install wheel    # 安装wheel
wheel   # 查看wheel是否安装成功

pip wheel PyTZ
pip install pyparsing==1.5.6 --upgrade --user

pip install --user  matplotlib

使用matplotlib来画图
matplotlib官网

python -m pip install matplotlib
# 或者 pip install matplotlib
import matplotlib.pyplot as tmp    # 从matplotlib里面导入pyplot模块
foo = [1,4,9,16,25]   # 创建列表
tmp.plot(foo)   # 将列表传递给函数plot
tmp.show()    # 显示图形
# 在cmd里面直接输入jupyter notebook,即可使用jupyter notebook。将上述代码复制进它也能画图。

图片修改

plot.py

iimport matplotlib.pyplot as tmp   #导入模块并指定别名

arg = [1,2,3,4,5,6,7,8,9,10]     # 同 arg =list(range(1,11))
foo = [1,4,9,16,25,36,49,64,81,100]    # 同 foo = [x**2 for x in arg] 从而实现自动计算


# tmp.plot(arg,foo,linewidth=6)   #arg和foo的位置顺序对应了xy轴
tmp.scatter(arg,foo,s=200, edgecolor='none',c='red', cmap=tmp.cm.Blues)   
#.scatter()就是点图; s为点尺寸; edgecolor是点轮廓色,none-没有轮廓; 
#c是点填充色,c也可改成color #RGB颜色模式: c=(0,0.2,0.4,0.6,1.0),越接近1颜色越浅,越接近0越深。#颜色映射: c=foo; 
#cmap 告诉pyplot使用哪个颜色映射。Blues可换成Reds或者Greens试试(别忘了后面的s)。要了解pyplot 中所有的颜色映射, 请访问http://matplotlib.org/ , 单击Examples, 向下滚动到Color Examples,再单击colormaps_reference。

#添加title和x、y轴坐标
tmp.title("Title",fontsize=11)    
tmp.xlabel("xlabel",fontsize= 22)
tmp.ylabel("ylabel", fontsize = 33)

tmp.tick_params(axis='both',which='major', labelsize = 10) # 设置刻度标记的大小;which有3个刻度,major(主刻度线)、minor(副刻度线)、both
tmp.axis([0,15,1,108])    # 设置坐标轴取值范围

tmp.show()   #可替换成  tmp.savefig('C:/Users/HASEE/Desktop/tmp.png', bbox_inches='tight')     # 使用 别名.savefig()存储图片,指定路径;若不指定路径,则会保存在plot.py相同目录下;bbox_inches='tight'是剪掉图片空白位置,省略此参数则保留空白位置。

15.3 随机漫步

首先理解 randint 和 choice

#下面两个例子都是在1,2,3之间任意选择一个数赋值给左边

from random import randint
tmp = randint(1,3)   # randint(a,b)表示获取1到3之间的任何数,包括1和3
print(tmp)    

from random import choice
tmp = choice([1,2,3]) #choice(1,3)表示获取1到3之间的任何数,包括1和3
print(tmp)

ramdom_walk.py

from random import choice
class RandomWalk():
    def __init__(self,num_points=5000):    # __init__接受形参的值,并将它们存储在根据该类创建的实例属性中。
        self.n_p = num_points    # 以self为前缀的变量可以供类中所有方法使用。 这一步目的是获取存储在形参num_points中的值,并将其存储到变量num_points中,然后该变量被关联到当前创建的实例。
        self.x_values = [0]
        self.y_values = [0]

    def fill_walk(self):  #定义新方法,只有形参self,则后面创建的实例都能访问该方法
        while len(self.x_values) < self.n_p:
            x_direction = choice([1,-1])    # 从[]里面随机取一个值赋给左边
            x_distance = choice([0,1,2,3,4])     
            x_step = x_direction * x_distance

            y_direction = choice([1,-1])
            y_distance = choice([0,1,2,3,4])
            y_step = y_direction * y_distance

            if x_step == 0 and y_step == 0:
                continue

            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step

            self.x_values.append(next_x)
            self.y_values.append(next_y)

rw_visual.py,运行该代码可见随机漫步图

import matplotlib.pyplot as plt
from ramdom_walk import RandomWalk
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x_values,rw.y_values,s=15)
plt.show()

rw_visual.py代码改成如下,则关闭查看器之后输入y可模拟多次随机漫步,并且对图片进行了修饰

import matplotlib.pyplot as plt
from ramdom_walk import RandomWalk

while True:
    rw = RandomWalk()    #在()里面加入50000则可以将点数变成50000
    rw.fill_walk()

    #调整图片宽、高、分辨率、背景色(若略则有默认尺寸)
    plt.figure(figsize=(10,10),dpi=128,facecolor='gray',edgecolor='red')   #.figure()可实现图片调整。dpi是分辨率;facecolor是背景色;edgecolor是画板边框颜色;

    #给点着色(若略则有默认色)
    n_p = list(range(rw.n_p))   
    plt.scatter(rw.x_values,rw.y_values,c=n_p,cmap = plt.cm.Reds,edgecolor = 'none', s=15)

    #重绘起/终点(若略则起/终点大小颜色与其它点无异)
    plt.scatter(0,0,c='green',edgecolor = 'none', s=100)  #重新绘制起点,使之明显
    plt.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolor = 'none', s=200)  #重新绘制终点,使之明显


    #隐藏坐标轴(若略则有坐标轴)
    plt.axes().get_xaxis().set_visible(False)   #改False为True有坐标轴
    plt.axes().get_yaxis().set_visible(False)

    plt.show()

    #多次随机漫步
    keep_running = input("Make another walk? (y/n):")
    if keep_running == 'n':
        break

15.4 使用Pygal模拟掷骰子

访问http://www.pygal.org/ , 单击Documentation, 再单击Chart types。 可看到各种图表且每个示例都有源代码。

安装pygal

pip install pygal

die.py

from random import randint
class Die():
    def __init__(self, num_sides=6):
        self.num_sides = num_sides
    def roll(self):
        return randint(1, self.num_sides)

die_visual.py

from die import Die

# 创建实例
die_1 = Die()   # 创建一个6面的骰子,因为默认为6
die_2 = Die(10)  # 创建一个10面的骰子
#上面两个可修改为 die_1,die_2 = [],[]  这也是创建两个空列表的方法

# 掷骰子
results = []    # 创建空列表
for roll_num in range(50000):   #使用for循环来掷骰子100次
    result = die_1.roll() + die_2.roll()   #使用for循环来掷骰子100次
    results.append(result)    #将result追加到列表results中

print(results)

# 分析结果
frequencies = []

for value in range(2,die_1.num_sides + die_2.num_sides +1):
    frequency = results.count(value)   #列表.count(value) 表示计算列表中value有几个
    frequencies.append(frequency)   #将frequency追加到列表frequencies中
print(frequencies)

# 对结果进行可视化
import pygal
hist = pygal.Bar()  # 创建实例并存储在hist中
hist.title = "Results of rolling a D6 and D10 50000 times."
hist.x_labels = [ '2', '3', '4', '5', '6','7','8','9','10','11','12','13','14','15','16']   # .x_labels是添加横刻度值
hist.x_title = "Result"   # .x_title是添加横标题
hist.y_title = "Frequency of Result"   # .x_title是添加横标题
hist.add('D6 + D10', frequencies)  # 将frequencies中一系列的值添加到图表中,这些值的标签是D6。
hist.render_to_file('C:/Users/HASEE/Desktop/die_visual.svg')   # 将图保存并命名 die_visual.svg,指定路径,若不指定路径则图和该代码所在文件位于同一文件夹下。
import csv    #csv包含在python标椎库中
from datetime import datetime #模块中导入类

filename = 'C:/Users/HASEE/Desktop/sitka_weather_07-2014.csv'   # csv文件以逗号分割;将sitka_weather_07-2014.csv换成sitka_weather_2014.csv可绘制全年
with open(filename) as f:    #打开文件
    reader = csv.reader(f)    #读取文件
    header_row = next(reader)   #返回第一行
    #print(header_row)

#for tmp,foo in enumerate(header_row):   #enumerate可获取列表中每个元素的索引及其值
#    print(tmp,foo)

#提取并读取数据
    arg,highs,dates = [],[],[]  #创建两个空列表,一个用来存贮字符串,另一个存储数字。
    #arg = []  #再创建空列表等会儿存贮数字
    for row in reader:   #遍历行; #reader就是对象(object);row是对象每行;row[1]表示对象每行第二列,若为-1则为最后一列;
        highs.append(row[1]) #将每行第二个值追加到列表highs里面。
        foo = int(row[1])  #int()将字符串转成数字
        arg.append(foo)    #将数字追加到列表arg里面

#在图表中添加日期
        current_date = datetime.strptime(row[0], "%Y-%m-%d")  # 第一个实参是row[0],是对象每行第一列(日期);第二个实参告诉python如何设置日期格式。
        dates.append(current_date)

    print(highs)
    print(arg)

#根据数据绘制图形
from matplotlib import pyplot as plt
fig = plt.figure(dpi = 128, figsize = (10,6))
plt.plot(arg,c= 'red')
plt.plot(dates,arg,c='red')

#设置图形格式
fig.autofmt_xdate()   #绘制斜日期标签,避免重叠
plt.title("aaa",fontsize=36,c='pink')
plt.xlabel("x label",fontsize = 36,c='pink')
plt.ylabel("y label",fontsize = 36,c='pink')
plt.tick_params(axis='both',which='both',labelsize=16)# 设置刻度标记的大小;which有3个刻度,major(主刻度线)、minor(副刻度线)、both
plt.axis([0,40,30,100])    # 设置坐标轴取值范围

plt.show()

16.1.7

import csv    #csv包含在python标椎库中
from datetime import datetime #模块中导入类

filename = 'C:/Users/HASEE/Desktop/sitka_weather_2014.csv'   # csv文件以逗号分割;将sitka_weather_07-2014.csv换成sitka_weather_2014.csv可绘制全年
with open(filename) as f:    #打开文件
    reader = csv.reader(f)    #读取文件
    header_row = next(reader)   #返回第一行

#提取并读取数据
    highs,dates = [],[]  #创建两个空列表,一个用来存贮字符串,另一个存储数字。
    for row in reader:   #遍历行; #reader就是对象(object);row是对象每行;row[1]表示对象每行第二列,若为-1则为最后一列;
        current_date = datetime.strptime(row[0], "%Y-%m-%d")  # 第一个实参是row[0],是对象每行第一列(日期);第二个实参告诉python如何设置日期格式。
        dates.append(current_date)
        high = int(row[1])  #int()将字符串转成数字
        highs.append(high)    #将数字追加到列表arg里面

#根据数据绘制图形
from matplotlib import pyplot as plt
fig = plt.figure(dpi = 128, figsize = (10,6))
plt.plot(dates,highs,c='red')

#设置图形格式
fig.autofmt_xdate()   #绘制斜日期标签,避免重叠
plt.title("aaa",fontsize=36,c='pink')
plt.xlabel("x label",fontsize = 36,c='pink')
plt.ylabel("y label",fontsize = 36,c='pink')
plt.tick_params(axis='both',which='both',labelsize=16)# 设置刻度标记的大小;which有3个刻度,major(主刻度线)、minor(副刻度线)、both
plt.show()

16.1.9

import csv    #csv包含在python标椎库中
from datetime import datetime #模块中导入类

filename = 'C:/Users/HASEE/Desktop/sitka_weather_2014.csv'   # csv文件以逗号分割;将sitka_weather_07-2014.csv换成sitka_weather_2014.csv可绘制全年
with open(filename) as f:    #打开文件
    reader = csv.reader(f)    #读取文件
    header_row = next(reader)   #返回第一行

#提取并读取数据
    highs,lows,dates = [],[],[]  #创建两个空列表,一个用来存贮字符串,另一个存储数字。
    for row in reader:   #遍历行; #reader就是对象(object);row是对象每行;row[1]表示对象每行第二列,若为-1则为最后一列;很多数据集都可能缺失数据、 数据格式不正确或数据本身不正确。 此时可使用 try-exceptelse 代码块来处理数据缺失的问题。 有时使用continue 跳过一些数据, 或者remove() 或del 将已提取的数据删除。
        current_date = datetime.strptime(row[0], "%Y-%m-%d")  # 第一个实参是row[0],是对象每行第一列(日期);第二个实参告诉python如何设置日期格式。
        dates.append(current_date)
        high = int(row[1])  #int()将字符串转成数字
        highs.append(high)    #将数字追加到列表arg里面
        low = int(row[3])  #每行的第四列是最低气溫
        lows.append(low)


#根据数据绘制图形
from matplotlib import pyplot as plt
fig = plt.figure(dpi = 128, figsize = (10,6))
plt.plot(dates,highs,c='red',alpha=0.5)  # 根据日期对最高气温画图;alpha表示透明度,1完全不透明(默认),0完全透明。
plt.plot(dates,lows,c='blue',alpha=0.5)  # 根据日期对最低气温画图
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1)  #填充两条线之间的区域,dates对应两个y值,将之间的区域填充。


#设置图形格式
fig.autofmt_xdate()   #绘制斜日期标签,避免重叠
plt.title("aaa",fontsize=36,c='pink')
plt.xlabel("x label",fontsize = 36,c='pink')
plt.ylabel("y label",fontsize = 36,c='pink')
plt.tick_params(axis='both',which='both',labelsize=16)# 设置刻度标记的大小;which有3个刻度,major(主刻度线)、minor(副刻度线)、both
plt.show()

16.2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343