怎样给不同的柱子上添加不同的标准误差线(怎么给柱形图加误差线)
530
2022-05-30
一、 输入和输出
无论是从我们一开始的“hello world”,还是前面章节的里各种例子,基本都是些“自
说自话”。只有能够接收用户输入,根据输入动态生成结果,并输出到屏幕上展示出来,
才算一个较为完整的简单程序。
1. input 输入函数
获取用户输入,保存成一个字符串。哪怕你输入的是个数字 1,返回给你的只会是字符
串“1”,而不是 整数 1。
示例:
>>> inp = input("please input your name: ") please input your name: jack >>> inp 'jack' >>> type(inp)
’ 前后带有空白 ’
从上面例子的展示中,我们不难发现,input 函数将我们的输入原样不动的返回给了我
们,并包装成一个字符串。这肯定是不行的,会带来很多问题,所以通常我们都需要对
用户输入进行处理和判定。
比如对空输入进行处理:
inp = input("请输入你的姓名: ") if inp == "": inp = input("姓名不能为空,请重新输入: ")
比如将字符串转换成数字类型:
age = input("请输入你的年龄: ") age = int(age) # 将字符串转化为整数 if age > 18: print("你已经成年!") else: print("未成年!!!")
去除开头的空白 lstrip,去除结尾的空白 rstrip 以及去除两端的空白 strip
inp = input("请输入你的姓名: ") inp = inp.strip() # strip 的用法在字符串数据类型有讲述 print(inp)
判断输入的字符类型
前面我们在将字符串转化为整数用的是 int()函数,这种方式有危险的,看下面的例子:
>>> s = "123" >>> a = int(s) >>> a 123 >>> s = "something" >>> a = int(s) Traceback (most recent call last): File "
对于形如“123”, “283242”的字符串,转化没问题,但是对于包含字符、特殊字
符的字符串就没办法转化了,会弹出异常错误。所以在使用 int 函数之前,要先对输入
进行判断。我们修改一下上面的例子:
age = input("请输入你的年龄: ") if age.isdigit(): # 使用 isdigit 函数判断输入是否全是数字格式 age = int(age) # 将字符串转化为整数 print("你的年龄是: ", age) else: print("输入不合法!")
input 函数有时可以巧妙地用于阻塞或暂停程序
print("程序前面部分执行完毕......") input("请按回车继续......") # 在这里程序会暂停,等待你的回车动作 print("继续执行程序的后面部分......")
2,print 输出函数
print 函数我们其实已经不陌生了,前前后后也用了不少次,多少有点经验,明白点它
的用法了。
print 函数用于将内容格式化显示在标准输出上,主要指的是屏幕显示器。
print 可以接受多个字符串,字符串类型的变量或者可 print 的对象。每个字符串用逗号
“,”隔开,连成一串输出。print 会依次打印每个字符串,同时,每遇到一个逗号“,”
就输出一个空格。
>>> a = "i am" >>> b = "student" >>> print(a,"a" , b) i am a student # 自动以空格分隔 >>> print(a+"a"+b) i amastudent # 无分隔
对于形如 print(a+“a”+b)的语句,其实是先计算 a+“a”+b 的值,然后再通过 print 打印
它。print()会自动执行内部的语句,输出想要的结果。
我们看一下 print 函数的原型:print(self, *args, sep=’ ‘, end=’\n’, file=None)
sep 参数: 分隔的符号,默认是一个空格;
end 参数: 打印后的结束方式,默认为换行符\n。如果,设置 end=’’,则可以不换行,
让 print 在一行内连续打印。活用 print 的参数,可以实现灵活的打印控制。
>>> a = "i am" >>> b = "student" >>> print(a,"a" , b, sep="*") i am*a*student
3.print 格式化输出
在 Python2.6 以后,有两种格式化输出的方式。
一种就是类似 C 语言的 printf 的%百分号格式化输出,也是 Python 最基础最常用的格
式化输出方式。另一种就是 str.format()的方式,在前面的章节已经介绍过。
几个的例子回顾一下:
s = "i am %s" % "jack" s = "i am %s age %d" % ("jack", 18) s = "i am %(name)s age %(age)d" % {"name": "jack", "age": 18} s = "percent %.2f" % 99.97623 s = "i am %(pp).2f" % {"pp": 123.425556, } s = "i am %.2f %%" % 123.425556
二、赋值语句
赋值语句用于把对象赋给一个名称,基本形式是
赋值语句的目标 = 要赋值的对象
左侧的目标可以是 变量名或对象元素,右侧的对象可以是任何会计算得到的对
象的表达式
赋值语句的特性:
Python 中的变量赋值不需要类型声明
赋值语句建立对象引用值
建立对象的引用值,而不是复制对象。python 变量更像是指针,而不是数据存
储区域
变量名在首次赋值时会被创建
在首次将值赋值给变量时创建其变量名
变量名在引用前必须先赋值
使用尚未进行赋值的变量名是一种错误
示例:
spam = ‘Spam’ spam, ham = ‘yum’, ‘YUM’ #按照位置把右边的对象和左边的目标从左至右相配对 [spam, ham] = [‘yum’, ‘YUM’] a, b, c, d = ‘spam’ a, *b = ‘spam’ #a=s, b=pam 一个列表赋给了带星号的名称,该列表收集了序列中没有赋值给其他名称的所有 项。 a, *b, c = ‘spam’ # a=s, c = m, b = pa spam = ham = ‘lunch’ #多目标赋值 spam 和 ham 都是字符串 lunch 的引用 spams += 42 #增强赋值运算 spams = spams + 42 str = ‘spam’ a, b, c = str # error, 左右元素个数不匹配 a, b, c = str[0:3] # correct
三、注释
我们写的程序里,不光有代码,还要有很多注释。注释有说明性质的、帮助性质的,它
们在代码执行过程中相当于不存在,透明的,不参与任何工作。但在代码维护、解释、
测试等等方面,发挥着不可或缺的重要作用。每一位程序员都要尽量写出高质量的注释。
1. 单行注释
Python 中,以符号“#”为单行注释的开始,从它往后到本行的末尾,都是注释内容。
#!/usr/bin/python3 # 下面这个方法的作用是….. # 第一个注释 # 我是单行注释 # 这是一个空的函数,它什么都不干。本条注释也是句废话。 def main(): pass # pass 表示占位,什么都不做
2. 多行注释
多行注释用三个单引号 ‘’’ 或者三个双引号 “”" 将注释括起来,例如:
单引号(’’’)
''' 这是多行注释,用三个单引号 这是多行注释,用三个单引号 这是多行注释,用三个单引号 ''' print("Hello, World!")
双引号(""")
""" 这是多行注释,用三个双引号 这是多行注释,用三个双引号 这是多行注释,用三个双引号 """ print("Hello, World!")
3. 注释文档
在某些特定的位置,用三引号包括起来的部分,也被当做注释。但是,这种注释有专门
的作用,用于为__doc__提供文档内容,这些内容可以通过现成的工具,自动收集起来,
形成帮助文档。比如,函数和类的说明文档:
def func(a, b): """ 这个是函数的说明文档。 :param a: 加数 :param b: 加数 :return: 和 """ return a + b class Foo: """ 这个类初始化了一个 age 变量 """ def __init__(self, age): self.age = age
需要强调的是这类注释必须紧跟在定义体下面,不能在任意位置。
四、 语句与缩进
语句:在代码中,能够完整表达某个意思、操作或者逻辑的最短代码,被称为语句。语
句通常不超过一行,超过一行的称为多行语句。
像下面的都称为语句:
a = apple from . import modles print("haha") lis.append(item)
Python 的标准语句不需要使用分号或逗号来表示语句结束,简简单单的换个行就表示
本语句已经结束,下一句开始。
代码块:为完成某一特定功能而联系在一起的一组语句构成一个代码块。有判断、循环、
函数、类等各种代码块。代码块的首行通常以关键字开始,以冒号( : )结束。比如:
# 这是一个判断流程代码块 if expression : pass elif expression : pass else : pass
又比如:
# 这是一个类代码块 class Foo: def __init__(self, name, age): self.name = name self.age = age def get_name(self): return self.name # 这是一个函数代码块 def func(a, b): summer = a+b return summer*2
Python 最具特色的语法就是使用缩进来表示代码块,不需要使用大括号({})。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
如果缩进数的空格数不一致,会抛出缩进异常(请记住 IndentationError 这个异常名!
新手会经常和它做朋友):
File "test.py", line 6 print ("False") # 缩进不一致,会导致运行错误 ^ IndentationError: unindent does not match any outer indentation level
PEP8(Python 官方的代码规范):建议使用四个空格作为缩进!在文本编辑器中,需
要设置把 Tab 自动转换为 4 个空格,确保不混用 Tab 和空格。在 Pycharm 中:tab 键
被自动转换成 4 个空格的缩进。
那么怎么才是正确的缩进方式呢?
所有的普通语句,顶左开始编写,不需要缩进
所有的语句块,首行不用缩进,从冒号结束后开始下一行,都要缩进
直到该语句块结束,就退回缩进,表示当前块已结束
语句块可以嵌套,所以缩进也可以嵌套
比如,我们写一个 if/else 的判断控制语句块:
首先是,第 1 句,不需要缩进:
if i > 10:
然后是第 2 句,这时已经进入 if 内部了,需要缩进:
if i > 10: i = i + 10 # 左边有 4 个空格
接下来是第 3 句,因为还在 if 内部,所以保持和第二句一样的缩进
if i > 10: i = i + 10 # 左边有 4 个空格 print(i) # 左边有 4 个空格
第 4 句,我们 if 分支走完了,要走 else 分支,那么 if 语句块算结束了,缩进要回退。
if i > 10: i = i + 10 # 左边有 4 个空格 print(i) # 左边有 4 个空格 else:
第 5 句,进入 else 语句块了,要缩进 4 个空格:
if i > 10: i = i + 10 # 左边有 4 个空格 print(i) # 左边有 4 个空格 else: i = i - 10 # 左边有 4 个空格
第 6 句,else 分支也走完了,整个 if/else 流程完毕,下面是别的代码了,那么 else 分
支的缩进也要退回。
if i > 10: i = i + 10 # 左边有 4 个空格 print(i) # 左边有 4 个空格 else: i = i - 10 # 左边有 4 个空格 print("apple") # 缩进回退了,这里已经和 if、else 没什么关系了。
再看一个缩进嵌套的例子,以两个 for 循环嵌套为例:
for i in range(10): for k in range(10): # 同样也是 for 循环,由于嵌套在另一个 for 内部,需要缩进 if k != i: # 双重循环内的 if,需要 2 次缩进,也就是顶左开始 8 个空格 print(k) # 又嵌套了一个 if 语句块,再次缩进 4 个空格,共计 12 个 else: # if 结束,回退 4 个,开始 else 分支 print(i+k) # 又增加缩进 print(i) # 这次不但 else 结束了,连内部的 for 也结束了,回退 8 个空格
刚开始,缩进的语法可能让你搞不清楚,何时缩进,何时回退,该缩进几个空格。但多
写写,多看看,很快就能掌握,并不再犯错。Python 的缩进语法设计有别与其它所有
的语言,是独家特色,一直争论很大,喜欢的非常喜欢,觉得简洁明了,节省了不少功
夫,而且强制代码整齐。不喜欢的,觉得缩来缩去,头都晕了,容易犯语法错误,并且
不能使用规格化工具。
同一行写多条语句:
前面我们说了,Python 一行通常就是一条语句,一条语句通常也不会超过一行。其实,
从语法层面,Python 并没有完全禁止在一行中使用多条语句,也可以使用分号实现多
条语句在一行,比如:
import sys; x = ‘abc'; y=1
上面这一行其实包含 3 条语句,用分号分隔了,但是强烈建议不要这么做,这样会导致
代码阅读困难、维护耗时,容易出错,老老实实地用三行来表示,不但更优雅,还增加
了代码行数,可以跟老板说今天多写了 2 行,^_^。
多行语句: 前面是多条语句在一行,但如果一条语句实在太长,也是可以占用多行的,
可以使用反斜杠()来实现多行语句:
string = "i love this country,"\ "because it is very beautiful!"\ "how do you think about it?" \ "Do you like it too?"
在 [], {}, 或 () 中的多行语句,可以不需要使用反斜杠(),直接回车,接着写。例如:
result = subprocess.Popen("ipconfig /all", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, check=True)
建议:每一行的字符不超过 79 个。该换行时咱就换行!
五、空白字符与空白行
空白行、空白字符与代码缩进不同,并不是 Python 语法的一部分。空行或者空白字符
会被当做空气一样的忽略。连续的空行或空白字符和单独的空白行几字符没有区别。书
写时不插入空白行或空白字符,Python 解释器运行也不会出错。但是空白的作用在于
分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
PEP8 对于空行留白有专门的建议。
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也
用一行空行分隔,以突出函数入口的开始。
变量赋值的时候等号左右各给一个空白。逗号后面跟一个空白。
六、pass 语句
pass 语句是占位语句,它什么都不做,只是为了保证语法的正确性而写。以下场景中,
可以使用 pass 语句:
当你不知道后面的代码怎么写的时候
当你不需要写代码细节的时候
当语法必须,又没有实际内容可写的时候
其它的一些你觉得需要的场景
例如:
# 我只想说明这个 func 函数需要三个参数,具体执行什么并不重要 # 但是函数体内如果什么都没有,会出现语法错误 # 这个时候,pass 就是最好的选择。 def func(a,b,c): pass
七、报错信息
现在,我们已经开始写一些简单的 Python 代码和语句了,犯错是免不了的,Python 给
我们提供了很全面细致的错误调用栈信息,帮助我们查找错误。以下面的代码为例(我
额外给包括空行在内的每一行添加了行号信息):
def foo(s): #1 return 10 / int(s) #2 #3 def bar(s): #4 return foo(s) * 2 #5 #6 def main(): #7 bar('0') #8 #9 main() #10
运行代码后,会弹出如下的错误:
Traceback (most recent call last): File "F:/Python/pycharm/201705/1.py", line 10, in
这些信息就是错误提示。我们需要从上往下读,英文看起来很复杂,其实很易懂。
Traceback…表示追踪错误开始,说在某个位置的 1.py 文件的第 10 行中的 main 这个函
数出了问题。那么问题出在哪呢?是 1.py 文件中的第 8 行的 bar 函数调用出了问题,
那么出什么问题呢?还没找到根子,又说在第 5 行,第 2 行调用出了问题,然后最终发
现是 return 10 / int(s)这行语句的问题。问题是什么,发生了除零错误ZeroDivisionError是一个除零异常。到这里,我们恍然大悟,我让 10 除 0 了,所以出现错误了,那么就
知道怎么改了。
其实查找错误,排除错误就是这么简单,只是需要你耐心的一行行地查看错误调用栈,再根据最后的错误类型,就可以判断错误的发生原因并修改错误,没有想象中的那么复杂。
5G教育 Python
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。