【愚公系列】2021年12月 Python教学课程 08-基本语法

【愚公系列】2021年12月 Python教学课程 08-基本语法,第1张

【愚公系列】2021年12月 Python教学课程 08-基本语法

文章目录
  • 一、 输入和输出
    • 1. input 输入函数
    • 2.print 输出函数
    • 3.print 格式化输出
  • 二、赋值语句
  • 三、注释
  • 四、 语句与缩进
  • 五、空白字符与空白行
  • 六、pass 语句
  • 七、报错信息


一、 输入和输出

无论是从我们一开始的“hello world”,还是前面章节的里各种例子,基本都是些“自
说自话”。只有能够接收用户输入,根据输入动态生成结果,并输出到屏幕上展示出来,
才算一个较为完整的简单程序。

1. input 输入函数

获取用户输入,保存成一个字符串。哪怕你输入的是个数字 1,返回给你的只会是字符
串“1”,而不是 整数 1。
示例:

>>> inp = input("please input your name: ")
please input your name: jack
>>> inp
'jack'
>>> type(inp)

>>> age = input("please input your age: ")
please input your age: 18
>>> age
'18'
>>> type(age)

>>> a = input("请输入一个字符:")
请输入一个字符:
>>> a
>>> a = input("请输入一个字符:")
请输入一个字符: 前后带有空白 
>>> a

’ 前后带有空白 ’
从上面例子的展示中,我们不难发现,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 "", line 1, in 
 a = int(s)
ValueError: invalid literal for int() with base 10: 'something'

对于形如“123”, “283242”的字符串,转化没问题,但是对于包含字符、特殊字
符的字符串就没办法转化了,会d出异常错误。所以在使用 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
二、赋值语句

赋值语句用于把对象赋给一个名称,基本形式是
赋值语句的目标 = 要赋值的对象
左侧的目标可以是 变量名或对象元素,右侧的对象可以是任何会计算得到的对
象的表达式
赋值语句的特性:

  1. Python 中的变量赋值不需要类型声明
  2. 赋值语句建立对象引用值
    建立对象的引用值,而不是复制对象。python 变量更像是指针,而不是数据存
    储区域
  3. 变量名在首次赋值时会被创建
    在首次将值赋值给变量时创建其变量名
  4. 变量名在引用前必须先赋值
    使用尚未进行赋值的变量名是一种错误
    示例:
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

运行代码后,会d出如下的错误:

Traceback (most recent call last):
 File "F:/Python/pycharm/201705/1.py", line 10, in 
 main()
 File "F:/Python/pycharm/201705/1.py", line 8, in main
 bar('0')
 File "F:/Python/pycharm/201705/1.py", line 5, in bar
 return foo(s) * 2
 File "F:/Python/pycharm/201705/1.py", line 2, in foo
 return 10 / int(s)
ZeroDivisionError: division by zero

这些信息就是错误提示。我们需要从上往下读,英文看起来很复杂,其实很易懂。
Traceback…表示追踪错误开始,说在某个位置的 1.py 文件的第 10 行中的 main 这个函
数出了问题。那么问题出在哪呢?是 1.py 文件中的第 8 行的 bar 函数调用出了问题,
那么出什么问题呢?还没找到根子,又说在第 5 行,第 2 行调用出了问题,然后最终发
现是 return 10 / int(s)这行语句的问题。问题是什么,发生了除零错误ZeroDivisionError是一个除零异常。到这里,我们恍然大悟,我让 10 除 0 了,所以出现错误了,那么就
知道怎么改了。
其实查找错误,排除错误就是这么简单,只是需要你耐心的一行行地查看错误调用栈,再根据最后的错误类型,就可以判断错误的发生原因并修改错误,没有想象中的那么复杂。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5658016.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存