目录
一、写在前面
1.基本内容
本文旨在帮助白云学院的刚刚接触Python的同学初步掌握基本的编程方法与编程思想,故只保留了Python最基础最常用的部分,避免在刚开始学习编程时就接触过于抽象的内容。
文中绝大部分内容为了帮助大家能够明了其本质,可能会使用一些不恰当的比喻或者解释。不过对于初学者而言,快速入门才是最重要的,至于这些事实的真相还待各位以后亲自去探索。
Python的下载与安装,由于网上已经出现了无数浅显易懂的教材,我便不再赘述。希望各位能够养成独立解决问题和使用搜索引擎的能力,这在学习编程中非常重要。
2.三个目标
低级目标:如果你只想通过这门选修课并顺利地拿到学分,那么在下文中我会放出案例1-4的代码,你所需要做的就是以下四件事情:
1.在实验环境中打开浏览器
2.输入 www.csdn.net 进入CSDN
3.在CSDN中搜索 软件工程师TonnyJack,然后在我的主页中找到这篇博客
4.复制代码到实验环境中你所创建的Python文件,最后运行截图提交。
中级目标:如果你希望在这门选修课中学到点东西,但学到什么无所谓,仅仅是因为不想花了时间却毫无收获。那么我会教你最基本的Python知识,掌握理解代码和调试代码的能力,至少在照抄代码时知道怎么修改错误。
高级目标:如果你是真正对编程感兴趣,希望自己能够将Python运用到生活中,那么我会教你基本的Python知识和编程的基本方法,帮助你掌握独立编写代码的能力。由于篇幅太短不能完整地将我的知识传授给你,希望你直接来找我,我会手把手带你入门。You know who I am.
二、编程的本质
1.编程语言
各位或许听说过这样一件事:在计算机中,数据都是以一连串的二进制位来表示的,例如:1010010011这样的二进制数。从某些方面来说,这种说法是正确的。在编程中,我们将这样的二进制数称为,机器语言或机器码。顾名思义,就是只有机器才能理解的语言。而我们对计算机的操作本质上又是对计算机发出各种指令,并且计算机只能理解这种二进制表示的机器语言。那么当我们想要对计算机发出指令让它为我们工作时,就必须使用这种对人类来说极为晦涩艰深的机器语言,显然这对人类使用计算机产生了极大的困难。
因此,汇编语言出现了。在解释汇编语言前,我们要先了解我们对计算机发出的指令都是什么样的。首先,在计算机的内存中存放着各种各样的数据与指令,例如:取数据指令,相加指令,相乘指令,赋值指令等等。
那么假设我们想要使用计算机来为我们计算 a+b,计算机会怎么做?第一步:对计算机发出取指令将内存中存放的数据a取出来,第二步:对计算机发出相加指令,第三步:对计算机发出取指令,将内存中存放的数据b取出来,让它与a相加。
而在计算机中,这些数据和指令都是以人类难以理解并掌握的二进制的形式存在的。而汇编语言,就是用人能看懂的符号来代替这些二进制表示的指令。如用ADD代替加指令,MUL代替乘指令。
而我们要学习的编程语言,也被称为高级语言,就是将多条指令进行整合,将其变为单条指令完成输送,让人类能够以更加轻松的方式来对计算机发出指令。
上面的内容或许不太好理解,不过没关系,各位只需要大致了解即可,下面的内容才是重点。
编程语言大体上分为两种:编译型语言和解释型语言。编译型语言就是在程序员编写完代码后,由编译器将代码转换为计算机能理解的机器语言并由其执行。解释型语言,也就是我们常说的脚本语言,就是由解释器将代码给计算机一条一条地解释并由其执行,因此解释型语言可以写一行代码执行一行。我们将要学习的Python就是一种解释型语言,Python语言的解释器就叫Python解释器,也就是我们安装Python时在官网下载的那个东西。
2.集成开发环境
下面我将简单介绍一下集成开发环境。
我们在安装Python时会安装一个叫Pycharm的软件,这个软件就是集成开发环境(IDE)。它的作用是将我们编程时需要的各种功能集成在一起,例如代码提示,语法检查等,以此来为我们编程提供方便。但是,编写和运行代码最重要的是这个语言的编译器或者解释器,IDE只是一个辅助我们写代码的工具,至于用什么来写代码完全取决于你的个人喜好,你甚至可以使用txt文件来编写代码。当然,我们还是建议各位使用Pycharm来编写Python程序,它的功能足够强大,完全能够满足你的编程需求。
三、Python基础语法
现在,我们就要真正进入Python的学习了。对于各位从未接触过编程的初学者来说,最缺乏的是编程思想,这也是编程入门的核心。不过各位不用担心,学习编程语言与学习数学有一定的相通之处。因此,各位在学习编程时可以带入数学思想,以此来帮助各位更好地理解编程。
1.常用的基本数据类型
各位现在需要了解的数据类型有以下三种:1.数字型(Number) 2.字符串型(String)3. 列表(List)。
各位要了解的数字型有三种:1.int(整型) 2.float(浮点型)3. bool(布尔型)。
1.int(整型):int是英文Integer的缩写,意为整数。本质上就是数学中的整数,即不带小数点的数。如:1,123123,3294623492,-1237873。
2.float(浮点型):float在英文中意为浮动,即浮点数。本质上就是数学中的小数,即有小数点的数。如:1.234234,33.4324628,-11.2137127874。注意:int型可以转换为float型,如整形数据123可以表示为float型123.00。但是如果要将float型转换为int型,则会造成精度丢失。如float型数据17.2342如果将其转换为整型就会变成17,而小数点后的四位数丢失了。
3.bool(布尔型):这种数据只有两个数,分别为:True和False(注意第一个字母是大写)。bool型数据的作用我们会在后面讨论。
4.String(字符串型):字符串或串(String)是由数字、字母、下划线组成的一串字符。
2.变量的赋值
变量的赋值可以简单理解为数学上的设未知数。例如:令x=20,设y=ax+b。但在讨论变量赋值之前我要先介绍一下“等号”。
在数学中,等号的作用是令等号两边的式子相等。但在编程中它的作用是“赋值”,即将等号右边的值赋值给等号左边的变量。注意!赋值的概念非常重要,不能简单地将编程中的等号理解为数学上的相等。下面我们来看几个例子理解一下赋值的概念:
变量赋值的语句为
变量名 = 值
即将等号右边的值赋给等号左边的变量
注意,等号右侧的值不一定是一个具体的数
它可以是另外一个变量或者一个表达式等等,如
a = 1
b = a
c = a + b
整型变量的赋值
a = 10
b = 0
c = -100
在上面,我们分别定义了三个变量abc,并分别为他们赋了不同的值
而这些值都是整数,因此我们称这三个变量为
整型变量
浮点型变量的赋值
x = 1.23
y = 2.3213
z = -123.5435
到这里相信大家应该能理解这三行代码的含义了
我们分别定义了三个变量xyz,并分别为他们赋了不同的值
而这些值都是浮点数,因此我们称这三个变量为
浮点型变量
布尔型变量的赋值
abc = True
xyz = False
前文提到过,布尔型变量只有 True 和 False 两个值,因此我们在这里只定义了两个变量
字符串型变量
str1 = "Hello baiyun college"
str2 = "你好,白云学院"
str3 = "_3123abnc"
str4 = "123"
我们前文提到过,字符串是由数字、字母、下划线组成的一串字符
而字符串最重要的是它要用双引号 "" 包裹起来以此来区分它与其他的数据类型
列表
列表是一种存储数据的结构,不想前面的变量一样,一个变量一次只能有一个值
而列表可以存储多个不同类型的数据
我们来看看定义列表的方式
ls1 = []
ls2 = [1, 2.342, "你好白云学院"]
ls1 和 ls2 都是列表,但 ls1 中没有任何数据,因此也被称为空列表
而 ls2 中存放了三个不同类型的数据
其实列表的概念非常好理解,你可以将它类比为数学上的集合
但区别在于,数学中的集合要求集合中的元素是同类型的,而列表却没有这个限制
列表的用法我们会在后文中详细讨论
3.变量命名规范
或许有同学会对变量名产生一些疑问,上面定义的变量名如a,b,c,xyz,abc它们是随便取的吗,还是只能选特定的名字呢。这就涉及到了变量的命名规范,变量命名是有限制的:
变量名可以由字母、数字、下划线(_)组成,但是不能以数字开头。
变量名不能是 Python 关键字,但可以包含关键字。
变量名不能包含空格。
第一条规则与第三条规则大家应该很好理解,但是对于第二条可能就对关键字的含义感到疑惑。
简单来说,关键字就是Python里面内置的有特定含义的字符。例如,print是Python的打印函数,它是Python自带的名字,你就不能使用它。
各位也许有点担忧,那定义变量的时候要怎样才能知道我起的变量名不是关键字呢?
1. 当你在定义变量的时候想以某个字符作为变量,但是突然想起来这个字符是关键字,那么你自然而然的就会打消用这个关键字来命名变量的念头。
2. 如果你不知道某个字符是关键字,但你又使用它作为变量名时,Pycharm会在这个变量名下面画一条下划线,表示这个变量名是关键字。
3. 如果你不知道某个字符是关键字,但你又使用它作为变量名并且没有注意到Pycharm的提示,怎么办?大不了就报错嘛,你可以通过报错信息找到这个变量命名的错误,然后把变量名改成一个不是关键字的字符就好啦。
正确的变量名在编程中不会对程序的运行造成任何影响,因此任何合法的变量名都是可以使用的,不用担心对程序的影响。
但是,程序不仅仅是写给计算机看的,也是给人看的,因此培养良好的编程习惯非常重要。而其中一点就是养成良好的变量命名习惯,在这里我推荐大家使用驼峰命名法。
驼峰命名法就是命名变量的时候用若干个英文单词或单词缩写来表示这个变量的作用,并且除了第一个单词用小写外,后面的单词首字母全部大写。例如,我想定义一个变量,这个变量的意义是接收用户的输入,那么我可以写成:getUserInput。
到这里变量的命名我就不再赘述了,有疑问的部分可以直接来问我或者使用搜索引擎寻找你想要的答案。
4.Python运算符
Python常用的运算符有以下几个
1.算数运算符
加减乘除 + - * /
Python中的加减乘除与数学中的加减乘除是一样的
各位应该能够很好理解
a = 1
b = 3
c = a + b # c = 4
d = a - b # d = -2
e = c * d # e = -8
e = e / c # e = -2
求余运算 %
这个运算符的作用是求 % 左边的数除以右边的数的余数
a = 10
b = 3
c = a % b # c = 1 因为 10 / 3 = 3 余 1
整除运算 //
这个运算符的作用是求 // 左边的数除以右边的数的商并去掉小数点后的数
a = 20
b = 3
c = a // b # c = 6 因为20 / 3 = 6.66666无限循环,去掉小数点后的数就是 6
幂运算 **
这个运算符的作用是求 ** 左边的数的右边的数的次方
a = 2
b = 3
c = a ** b # c = 8 因为 2的3次方=8
2.关系运算符
小于 <
小于等于 <=
大于 >
大于等于 >=
不等于 !=
等于 ==(注意!这个 == 就是数学上的相等,而=在编程语言中表示赋值)
关系运算符非常重要,我们会在后面的流程中详细说明
3.逻辑运算符
与 and
或 or
非 not
逻辑运算符与关系运算符都会在后文的流程控制中详细讨论
5.流程控制
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 下面的内容将是重点中的重点 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
流程控制是所有编程语言最基础最重要的特性,它是编程的精髓,希望大家能够认真阅读体会下面的内容。
再说一遍,下面的内容真的真的很重要!
1.if 条件判断语句
if 在英文中是 如果 的意思,在语言中表示为,如果怎么怎么样,就怎么怎么样。在编程中也表示着同样的含义,它意味着 “选择”。下面我们来看一下 if 条件判断语句的基本格式,
if 条件判断语句有三种形式
1.只有 if
if 条件语句:
代码块1
代码块2
代码块3
...
在 if 后面要写一个条件语句,程序会根据这个条件的真假来选择性地运行程序
还记得我们前文中所提到的布尔型变量吗
条件语句本质上就是返回一个布尔值
如果这个条件语句是真的就会返回 True,否则返回 False
如果返回的是 True,那么程序就会执行 if 下面的代码块
如过返回的是 False,那么程序就会跳过 if 下面的代码块
如:
a = 100
b = 0
if a > b:
print("好耶!a 比 b大!")
# print()是一个打印函数,用于打印括号里面的数据
# 具体用法后面的函数部分会详细讨论
在上面的 if 语句中我们写了一个条件语句 a > b
那么程序就会在这里进行判断 a 是否大于 b
因为a是100,b是0,因此a > b是正确的,条件语句返回了布尔值 True
因为条件语句返回了布尔值True,所以程序会运行 if 下面的代码块
即输出字符串:好耶!a 比 b大!
既然条件语句的本质是返回布尔值 True 或 False,那我们可不可以直接用布尔值来代替条件语句呢?
当然可以!如:
if True:
代码块1
代码块2
代码块3
代码块一定会被执行
或者
if False:
代码块1
代码块2
代码块3
代码块一定不会被执行
2.if-else形式
在语言中,我们除了表达如果怎么这么样,就怎么怎么样之外,
还会表达 如果怎么怎么样,就怎么怎么样,否则就怎么怎么样
编程中也有同样的形式,即 if-else,else在英文中意为其他的,但在编程中意为否则。
在学习 if-else 前希望大家先理解上面的 if 语句
因为 if-else 和 等下要学习的 if-elif-else是相通的
理解了上面的 if 语句和条件语句 再去学习后面的内容会容易很多
我们先来看下 if-else 的形式
if 条件语句:
代码块1
代码块2
代码块3
...
else:
代码块1
代码块2
代码块3
...
if 语句和 if-else 的区别在于,如果条件语句返回的是 False
那么 if 语句后面的代码就会跳过,即不被执行
但对于 if-else 来说,如果条件语句返回的是 False
那么就会跳过 if 语句下面的代码块,执行 else下面的代码块
这就是 如果-否则的概念
例如:
a = 100
b = 0
if a == b:
print("好耶!a 和 b 是相等的!")
else:
print("好耶!a 和 b 是不相等的!")
在上面的 if 语句中我们写了一个条件语句 a == b
那么程序就会在这里进行判断 a 是否等于 b
因为a是100,b是0,因此a == b是错误的,条件语句返回了布尔值 False
因为条件语句返回了布尔值 False,所以程序不会运行 if 下面的代码块
而是去运行 else 下面的代码块
即输出字符串:好耶!a 和 b 是不相等的!
当然,如果 if 后面的条件判断语句是正确的,即返回了 True
那么程序就会执行 if 后面的代码,并跳过 else 后面的代码
3.if-elif-else 形式
if-elif-else 形式是对 if-else 的扩展
在 if-else 中,只有一个条件判断语句
判断为 True 就执行 if 后面的代码
判断为 False 就执行 else 后面的代码
但很多时候只有一个条件判断语句并不能满足我们的编程需求
因此就有了 if-elif-else
if-elif-else 和 if-else 的区别在于
if-else 只有一个条件判断语句,而 if-elif-else 有两个或两个以上
我们先来看下 if-elif-else 的基本形式
if 条件语句1:
代码块1
代码块2
代码块3
...
elif 条件语句2:
代码块1
代码块2
代码块3
...
elif 条件语句3:
代码块1
代码块2
代码块3
...
else:
代码块1
代码块2
代码块3
...
在 if-elif-else 中,会从 if 开始一个个的按顺序判断每个条件语句
直到有一个条件语句为真,然后执行该条件语句下的代码
如果所有的条件语句都为假,就执行 else 下的代码
例如:
score = 59
if score >= 90:
print("你太牛啦!")
elif score >= 70:
print("一般般吧")
elif score >= 60:
print("差点寄了,好好学习吧")
else:
print("60分都考不到?翼燕顶针,鉴定为:春春的飞舞")
我们首先定义了一个变量 score,并赋值为59
然后从 if 后面的条件语句开始判断
score >= 90吗?并不,返回False,if 下面的代码不会被执行
然后判断第一个 elif 后面的条件语句
score >= 70吗?并不,返回False,if 下面的代码不会被执行
最后判断第二个 elif 后面的条件语句
score >= 60吗?并不,返回False,if 下面的代码不会被执行
所有的条件语句都判断完了,并且都返回了 False
因此 else 后面的代码会被执行
条件语句
还记得前文提到的关系运算符和逻辑运算符码
在这里,我会详细讲解它们的作用
关系运算符
小于 <
小于等于 <=
大于 >
大于等于 >=
不等于 !=
等于 ==
在条件语句中我们会用它们来判断变量或值或表达式之间关系
例如
if a < b:
if a + 1 <= b:
if a * b > c:
if a == d:
if a != d:
关系运算符他们的含义和数学中是一样的,我想你应该能很轻松地理解
逻辑运算符
与 and
或 or
非 not
它们的含义是判断多个表达式之间的关系
------------------------------------------------------------------
1.and 表示 与 操作,基本用法为
表达式1 and 表达式2
只有当 表达式1 和 表达式2 都成立时才返回 True,其他情况返回 False
例如
a = 1
b = 100
if a < 10 and b > 100:
代码块1
在这个例子中,条件语句是 a < 10 and b > 100
那么就会同时判断 a < 10 和 b > 100 是否同时成立
a < 10 成立但是 b > 100 不成立,故代码块不会被执行
------------------------------------------------------------------
2.or 表示 或 操作,基本用法为
表达式1 or 表达式2
只要 表达式1 和 表达式2 有一个成立就返回 True,如果都不成立就返回 False
例如
a = 1
b = 100
if a < 10 or b > 100:
代码块1
在这个例子中,条件语句是 a < 10 or b > 100
那么就会同时判断 a < 10 和 b > 100 是否成立
b > 100 不成立但是 a < 10 成立,满足只要有一个成立就返回True的条件,故代码块会被执行
------------------------------------------------------------------
3.not 表示 非 操作,基本用法为
not 表达式
将表达式的结果取反,即
如果表达式成立返回 True,那么结果取反就是 False
如果表达式不成立成立返回 False,那么结果取反就是 True
例如
a = 1
if not a < 0:
代码块1
在这个例子中,条件语句是 not a < 1
那么就会判断 a < 1 是否成立
a < 0 不成立返回 False,取反后就是 True,就故代码块会被执行
通过上面的讲解,相信你对编程应该已经有点感觉了吧。还是那句话,上面的是重点,不理解的地方反复看几遍,最好能自己动手敲一下代码,实在搞不懂就来问我。
2.for 循环语句
在编程中,我们会需要计算机重复地做某些事情,这就有了循环。
循环是指满足一定条件的情况下,重复执行特定代码块的一种编码结构。
在Python中,常用的循环语句有两种,一种是for循环,另一种是while循环。在这一节,我们先来学习一下for循环的基本用法:
for 循环的基础用法为
for 循环变量 in range(整型):
代码块1
代码块2
代码块3
...
循环变量的变量名和前文中的变量命名规则是一样的
range() 函数会接收一个大于零的正整数
这个循环变量会从 0 开始 一直循环到 这个 正整数 - 1 为止
每一次循环都会执行一次 for 下面的代码块
例如
for i in range(10):
print(i)
在这个例子中,我将这个循环变量命名为 i
range() 函数中我填了 10
那么 i 就会从 0 开始一直循环到 9,一共循环10次
每一次循环都会把 i 的值打印出来
因此,这个程序的运行结果为
0
1
2
3
4
5
6
7
8
9
也就是说,
第一次循环时,i等于0,然后执行下面的代码,也就是把 i 打印出来
第二次循环时,i等于1,然后执行下面的代码,也就是把 i 打印出来
...
一直循环到 range()里面的 整数-1,也就是 9 后,循环就结束了
如果上面的讲解有些抽象的话,在后面的案例中我会在对 for 循环进行详细的讲解。
3.while 循环
while 循环的形式和 if 语句非常相似,有些时候它们甚至可以相互替代对方的功能。
我们先来看 while 循环的基本语法
while 条件语句:
代码块1
代码块2
代码块3
...
while 后面的条件语句形式和 if 中的条件语句是一样的
如果你对条件语句没什么印象的话可以再翻回去看看
while 循环的执行顺序是,先判断条件语句返回的是否为 True
是的话,执行下面的代码块,执行完后再次判断条件语句
判断为 True 就继续执行下面的代码块
每次执行完代码块后都会再次判断条件语句,直到条件语句为 False,循环结束
例如:
a = 5
b = 0
while b <= a:
print(b)
b = b + 1
在这个例子中,我们分别定义了两个变量 a 和 b,并分别赋值 5 和 0
然后开始执行 while 循环,首先判断 b 是否小于等于 a
是的话打印出 b 的值,并将 b + 1 赋值给 b 本身,也就是将 b 的值增加 1
然后继续判断条件语句是否为 True
当 b 不小于等于 a 时,循环结束
因此,这段程序的结果为
0
1
2
3
4
5
以上就是流程控制的基本内容,这一部分非常重要,希望你能有所收获。
6.函数
函数在编程中也是相当重要的一部分,编程中的函数和数学上的函数形式不同,但本质是一样的。在数学中,以一元函数为例,每一个自变量 x 都对应着唯一确定的 y。在编程语言中,每一个输入都有特定的输出。这或许有点抽象,你可以简单地将函数理解为一段封装的代码块。注意!仅仅写完一个函数是不能让函数运行的,在写完之后还要调用函数才能让函数里的代码块得到运行。
我们先来看 Python 定义函数的方式
def 函数名(参数1, 参数2, 参数3, ...,参数n):
代码块1
代码块2
代码块3
...
return
def 是定义函数关键字,关键字的概念我们在前面已经提到过了
函数名 和前文中的变量命名是一样的
参数 也叫 形参,形参的作用是在被调用时由程序员选择输入不同的参数
而这些参数在代码块中会使用到,因此,形参能够让函数获取不同的输入从而产生不同的输出
在定义函数时,我们可以根据自己的需要设定不同的参数
而参数的个数和形式是由程序员自己指定的,因此函数也可以没有参数
至于参数是什么类型的变量,取决于后面的代码块中这个参数是什么类型
例如,一个函数的参数在代码块中参与了算术运算,如加减乘除等,那么它一定是整型或浮点型
因为字符串、布尔值与列表没法做加减乘除的运算
又或者代码块对这个参数做了一些列表的操作,那么这个参数就一定是列表了
因此,在调用函数前,一定要明确这个函数的参数的数量以及它们的类型
如果一个参数接收了一个与该参数在代码块中参与的操作类型不相符的变量,程序就会报错
代码块 这些代码块只有在函数被调用时才会被执行
return 函数可以通过 return 向外界传递数据,
即函数可以通过变量赋值的方式把返回的值赋给其他变量
如
a = add(x, y, z)
我们来看看调用函数的方式
函数名(参数1, 参数2, 参数3, ...,参数n)
非常简单,调用函数只需要写 函数名 + 括号 + 对应的参数
我们来看几个简单的例子
---------------------------------------------------------------------------
没有参数没有 return 的函数
def sayHi():
print("你好!")
print("白云学院的同学")
定义完函数之后我们要调用它,然后代码块才会被执行
sayHi()
调用之后,就会执行 sayHi() 函数下面的代码块,输出
你好!
白云学院的同学
---------------------------------------------------------------------------
有参数没有 return 的函数
def judgeEven(n):
if n % 2 == 0:
print("这是偶数")
else:
print("这是奇数")
judgeEven() 函数的作用是判断一个数是否为偶数,里面有一个参数 n
在代码块中有一个 if-else 语句,if 后面的条件语句是
n % 2 == 0
即判断 n 除以 2 的余数是否为 0,如果为 0,就打印,这是偶数,否则打印这是奇数
定义完函数之后我们需要调用它
judgeEven(3)
我们调用了这个函数,并且将 3 作为形参输入到了函数中
那么函数中的形参 n 就等于3,然后执行函数里的代码块
首先判断 3 % 2 == 0,即 3 除以 2 的余数是否等于 0
3 除以 2 等于 1 余 1,故结果为 False
if 后面的代码块不会被执行,else 后面的代码块会被执行
输出:这是奇数
---------------------------------------------------------------------------
没有参数有 return 的函数
def PI():
a = 3
b = 0.14
return a + b
我们定义了一个函数名为 PI 且没有参数的函数,代码块中分别定义了 a 和 b 两个变量
并分别赋值 3 和 0.14,最后我们将 a + b 的值,即 3.14 return 了出去
也就是说我们可以以变量赋值的形式将函数 return 的值赋给其他变量
如
a = PI()
我们已经将函数 PI() 返回的值赋给了 a
此时我们可以把 a 打印出来
print(a)
输出结果为:3.14
---------------------------------------------------------------------------
有参数有 return 的函数
def f(x):
return x ** 2 + 3
在函数 f() 中我们定义了一个形参 x,并将 x ** 2 + 3
即 x 的 二次方 + 3 作为返回值 return 了出去
既然函数可以 return 值,那么它就不仅仅只是能把值赋给其他变量
我们也可以将函数本身当作变量去使用,比如直接打印它
print(f(3))
我们将 3 作为形参输入给了函数 f(),然后函数返回了 x ** 2 + 3,也就是 12
最后由 print() 函数打印出来
输出结果就是 12
7.Python中常用的内置函数
通过上文对函数的讲解我相信你对函数的用法已经有了基本的理解,而Python中有许多非常强大的内置函数供我们使用,在此我将简单介绍几个常用函数的基本用法。
1.print() 函数
这个函数我相信你一定不陌生,也许在你刚刚接触 Python 时就看到这个函数大量存在于代码中
它的基本用法就是将参数打印出来,而参数我们前面提到过是由调用函数的人来指定的
我们来看看它的最基础的用法
print(参数1, 参数1, 参数3, ...)
print() 函数会将所有参数在一行内打印出来,因此至少要填入一个参数
这个参数可以是一个变量,也可以是一个具体的值,还可以是一个有返回值的函数或一个表达式
比如
a = 3
def f(x):
return x ** 2
print(a, "你好白云学院", f(a), a + 1)
我们定义了一个变量 a 并赋值为3,还定义了一个有一个形参 x 的函数,并返回 x ** 2
最后我们调用了 print 函数将 变量a、字符串 "你好白云学院"、f(a)以及 a + 1 的结果打印了出来
因此这段程序的结果为
3 你好白云学院 9 4
2.input() 函数
input() 函数的作用是让用户从控制台输入数据,并将用户输入的数据返回出去
input() 函数的形参个数为 0 或 1
如果没有参数,那么调用 input() 函数后控制台就不会有任何提示,用户可以直接在控制台输入数据
如果有参数,那么这个参数必须为字符串型,调用 input() 函数后就会将这个形参打印出来
也就是打印这个字符串,然后用户可以直接在控制台输入数据
而这个字符串的意义在于 提示用户
我们来看下这个函数的基本用法
a = input()
print(a)
我们调用了 input() 函数来获取用户的输入,并将获取到的值赋给 变量 a,最后把 a 打印出来
因为我们没有输入形参,因此用户在控制台看不到任何提示
当然我们也可以在 input() 函数中输入形参,如
a = input("请输入一个数据:")
print(a)
我们在 input() 函数中输入了一个形参 "请输入一个数据:"
那么用户就会在控制台看到这个字符串
值得一提的是,我们通过 input() 获取到的数据是字符串型的
例如用户输入了 3 或者 3.14,那么我们再赋值给 a 后,a 其实是一个字符串型变量
也就是说 a的值其实是 "3" 或者 "3.14",因为 input() 函数事先并不知道用户会输入什么数据
因此统一将用户输入的数当作字符串,而字符串型的数据是不能参与运算的
如果我们想要将这个数据转换为其他类型的数据,就要用到数据转换函数,这也是下面我要讲解的函数
3.数据类型转换函数
上文我们提到了 input() 函数统一将用户的输入当作字符串,那么当我们想要将用户输入的数据转换
为其他类型的数据时,就要用到 数据类型转换函数
在这里我会介绍三个 数据类型转换函数
1.int()
这个函数接收一个字符串型或者浮点型的参数,然后 int() 函数会将其转换为整型
注意如果是字符串型的数据,这个字符串必须是数字的形式
比如,"3.1242345" 这样的,不能包含英文、中文、下划线等等各种非数字的字符
这很好理解,我们不可能将一个非数字的字符,如 "abcd_白云学院_"这样的字符串转换为数字
如果是浮点型的参数,用 int() 函数将其转换为整型数据则会造成精度丢失的现象,这在前文提到过
如 int(123.12314),就等于 123,小数点后面的五位就丢失了
这个操作是合法的,但是要注意你在将浮点型数据转换为整型数据前,确定你要舍弃小数点后面的数
2.float()
有了对 int() 函数的详细介绍,float() 相信函数你应该也能轻易地理解了
float() 函数的作用是将输入的参数转换为浮点型
对字符串型的数据进行转换和 int() 函数是一样的,对整型数据进行转换也没有任何问题
不会造成精度丢失的现象,比如 float(3),那么结果就是 3.0
3.str()
这个函数也同样很好理解,就是将参数转换为字符串型
下面我来举几个例子
print(int("3.14")) # 结果就是 3
print(int(3.14)) # 结果就是 3
print(float("3.14")) # 结果就是 3.14
print(float(3)) # 结果就是 3.0
print(str(3.14)) # 结果就是 "3.14"
print(str(3)) # 结果就是 "3"
常用函数就先写这么多吧,以后想到了再写。Python的内置函数与第三方库的函数加起来可能有几千甚至上万个,不可能也没必要每一个都记住。最重要的点在于如何使用函数,当你需要它们的时候再去搜索它们的用法就可以了。
8.Python语法的一些特性与补充(必看)
无论你是真的想学习Python还是只想拿到学分,这一部分都很重要,尤其是只想拿学分的同学。下面的内容是我在群里反复强调的,但绝大部分同学都会出错的问题。
1.缩进
Python 是一个对缩进严格的编程语言,因为一个代码块是独立的还是属于某个函数或者某个流程控制语句都要靠缩进来判断。
例如下面这段代码
a = 1
b = 2
if a > b:
代码块1
代码块2
代码块3
代码块4
代码块5
代码块6
代码块1-3都是 if 语句后面缩进的部分,因此当 条件语句判断为真时就会执行代码块1-3
而代码块4-6是与 if 语句对齐的,也就是说它们不属于 if 语句
因此,无论 if 后面的条件判断语句是否成立,代码块4-6都会被执行
无论是条件判断语句、函数还是循环都要遵守缩进规则
如
def a():
代码块1
代码块2
代码块3
for i in range(10):
代码块1
代码块2
代码块3
while a > b:
代码块1
代码块2
代码块3
在一个结构(条件、函数、循环等)后面,只有缩进的代码块才属于它。
那么我们应该怎样缩进呢?其实缩进没有太多限制,可以是一个空格,也可以是若干个空格,但最重要的是一个文件内缩进的空格数必须都是相同的。比如,你想每次缩进两个空格,那么每次缩进的时候都必须是两个空格,不能一个地方缩进一个空格,另一个地方又缩进两个空格。
在这里,我建议各位使用键盘上的 Tab 键来缩进,在Pycharm中,一个 Tab 默认相当于四个空格,也就是说按一下 Tab 键相当于按了四次空格。
2.冒号
在每一个结构中(条件、函数、循环等),控制语句的结尾都要加一个英文冒号 : 表示代码的开始。
如
if 条件语句:
for i in range(10):
while 条件语句:
def func():
这个冒号是很多初学者容易忽略的点,因此在写代码时要有意识地加上这个冒号。
3.英文符号
在写代码时,有些同学会出现刚写完中文忘记切回英文输入法的情况。如果代码中出现了一些非英文的符号,如中文的冒号、中文的引号以及中文的括号等等,程序就无法正常运行。因此,在写代码时要有意识地留意当前输入法的状态,在看见输入了中文的符号时要及时更换为英文。
记住!在编程中,非英文的符号只允许出现在字符串里,其他地方必须使用英文符号。
4.注释
注释在编程中的作用是对程序进行补充说明,并提升代码的可读性。
在Python中,注释一般有两种,一种是单行注释,即同一行内 # 后面的部分都是注释,在Pycharm中显示为灰色。
另一种是跨行注释,用六个单引号 ''' ''' 或者双引号 """ """ 包裹,既可以跨行注释也可以单行注释,主要用于函数中对参数及返回值的说明。
四、案例(必看)
如果你只想顺利地通过这门选修课并拿到学分,那么你可以在实验环境中打开这篇博客,把代码复制上去就行了。
在这里,我只提供前四个案例,因为这门课的要求很低,只需要一百分就能通过。一个案例二十分,四个案例八十分,再做几个测验就能通过了。
1.投掷骰子
import random
def main():
# 在模拟投掷骰子的时候,事先不知道将要投掷多少次,所以采用无限循环
while True:
user_in = input('试试手气? 回车=掷骰子,Q=退出')
if user_in.upper() == 'Q':
break
# 使用 random 库的 randint 方法模拟投掷骰子的结果
num_rolled = random.randint(1, 6)
# 输出投掷结果
print('你掷出了 {} 点'.format(num_rolled))
print('欢迎下次再来!')
if __name__ == '__main__':
main()
2.猜数字
import random
def valid_number(guess_str):
""" 处理用户输入的字符串返回相应数字
:param guess_str: 用户输入的字符串
:return: 返回用户输入字符串处理后的结果,如果有效,则返回相应数字;
"""
num = None
# 判断输入的字符是否是数字
if guess_str.isdigit():
# 将数字字符串转换为相应的数字
tmp_num = int(guess_str)
# 判断数字是否在 1-100 范围之内,如果是则返回数字
if tmp_num >= 1 or tmp_num <= 100:
num = tmp_num
return num
def main():
# 生成要猜的数字
key_num = random.randint(1, 100)
# 猜数字的次数
guess_times = 0
print('请猜一个 1-100 之间的数字')
# 因为不清楚要猜测的次数,所以使用无限循环的方式
while True:
guess_str = input()
# 用户输入一次,则对猜测的次数 +1
guess_times += 1
# 对用户输入的字符串做处理
guess_num = valid_number(guess_str)
# 如果输入有效,则判断猜测的数字是否正确,并给出相应提示
if guess_num:
if guess_num < key_num:
print('太小了。再猜一次:')
elif guess_num > key_num:
print('太大了。再猜一次:')
# 当猜对时,退出循环,猜测结束
else:
break
# 如果输入无效,给出无效的提示
else:
print('输入无效。请猜一个 1-100 之间的数字')
# 打印猜测的次数
print('猜对了!一共猜了 {} 次'.format(guess_times))
if __name__ == '__main__':
main()
3.链表和树
tree.py
NIL = []
def pair(a, b):
"""创建一个pair对象。"""
return [a, b]
def is_pair(p):
"""判断p是否pair对象。"""
return isinstance(p, list) and len(p) == 2
def first(pair_object):
"""获取pair对象的first部分。"""
return pair_object[0]
def second(pair_object):
"""获取pair对象的second部分。"""
return pair_object[1]
def make_list(iterator):
"""使用迭代器的元素创建链表。
链表以pair对象为基础构造。"""
try:
# 这里采用递归的方式来构建链表,当迭代器迭代完成时,next函数抛出异常,结束递归
item = next(iterator)
return pair(item, make_list(iterator))
except StopIteration:
return NIL
def list_to_string(plist, pre='', suf=''):
"""将链表转换成不带嵌套括号的宁符串
:param plist:要转换的链表
:param pre:使用默认值
:param suf:使用默认值
:return:不带嵌套括号的字符串
:example:
plist = [1, [2, [3, []]]]
list_to_string(" ",plist,"')#将返回:123nn"
"""
if plist == NIL:
return pre + suf
else:
item = first(plist)
# 如果是嵌套的链表,将嵌套的链表用()括起来
first_str = list_to_string('(', item, ')') if is_pair(item) else str(item)
return list_to_string(second(plist), pre + first_str + ' ', suf)
def map_list(fn, plist):
"""对链表plist的每个元素应用fn函数,并返回新的链表"""
if plist == NIL:
return NIL
else:
new_item = fn(first(plist))
return pair(new_item, map_list(fn, second(plist)))
test.py
import unittest
import tree
class TestPair(unittest.TestCase):
# 测试生成pair函数
# 所有测试的函数全部以test命名开头
def test_pair(self):
p = tree.pair(1, 2)
# assertEqual(a, b, [msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过
self.assertEqual(tree.first(p), 1)
self.assertEqual(tree.second(p), 2)
# 测试make_list函数
def test_make_list(self):
# 使用make_list生成链表,注意,make_list需要一个迭代器,所以使用iter方法将列表先转换成一个迭代器
ls = tree.make_list(iter([1, 2, 3]))
item1 = tree.first(ls)
item2 = tree.first(tree.second(ls))
item3 = tree.first(tree.second(tree.second(ls)))
end = tree.second(tree.second(tree.second(ls)))
self.assertEqual(item1, 1)
self.assertEqual(item2, 2)
self.assertEqual(item3, 3)
self.assertEqual(end, tree.NIL)
# 测试map_list函数
def test_map_list(self):
ls1 = tree.make_list(iter([1, 2, 3]))
# 对链表的每个元素进行乘3的操作
ls2 = tree.map_list(lambda x: x * 3, ls1)
item1 = tree.first(ls2)
item2 = tree.first(tree.second(ls2))
item3 = tree.first(tree.second(tree.second(ls2)))
end = tree.second(tree.second(tree.second(ls2)))
self.assertEqual(item1, 3)
self.assertEqual(item2, 6)
self.assertEqual(item3, 9)
self.assertEqual(end, tree.NIL)
def test_tree(self):
# 使用list构造一棵数,存放下面的s表达式
# (* 1 (+ 2 3) (+ 4 5 6))
# 等价的中缀表达式为
# 1 * (2 + 3) * (4 + 5 + 6)
ls1 = tree.make_list(iter(['+', 2, 3]))
ls2 = tree.make_list(iter(['+', 4, 5, 6]))
exp_list = None
# 使用嵌套的链表表示S表达式
exp_list = tree.make_list(iter(['*', 1, ls1, ls2]))
self.assertEqual(tree.first(exp_list), '*')
self.assertEqual(tree.first(tree.second(exp_list)), 1)
sub_ls_1 = tree.first(tree.second(tree.second(exp_list)))
self.assertEqual(tree.first(sub_ls_1), '+')
self.assertEqual(tree.first(tree.second(sub_ls_1)), 2)
self.assertEqual(tree.first(tree.second(tree.second(sub_ls_1))), 3)
sub_ls_2 = tree.first(tree.second(tree.second(tree.second(exp_list))))
self.assertEqual(tree.first(sub_ls_2), '+')
self.assertEqual(tree.first(tree.second(sub_ls_2)), 4)
self.assertEqual(tree.first(tree.second(tree.second(sub_ls_2))), 5)
self.assertEqual(tree.first(tree.second(tree.second(tree.second(sub_ls_2)))), 6)
if __name__ == '__main__':
unittest.main()
4.面向对象程序设计实践
import random
# 一张牌类
class Card(object):
def __init__(self, suite, face):
"""
构造方法
: param suite:花色
: param face:点数
"""
self._suite = suite
self._face = face
# !获取点数
@property
def face(self):
return self._face
# 获取花色
@property
def suite(self):
return self._suite
# 返回花色点数
def getstrInfo(self):
if self._face == 1: # 点数1对应A字符串
face_str = 'A'
elif self._face == 11: # 点数11对应J字符串
face_str = 'J'
elif self._face == 12: # 点数12对应Q字符串
face_str = 'o'
elif self._face == 13: # 点数13对应K宁符串
face_str = 'K'
else:
face_str = str(self._face) # 点数转换为字符串
return '%s%s' % (self._suite, face_str)
# 一副牌类
class Poker(object):
# 构造方法
def __init__(self):
self._cards = [Card(suite, face) for suite in ['红桃', '黑桃', '梅花', '方块'] for face in range(1, 14)] # 生成52张扑克牌列表
self._current = 0 # 当前序列索引
# 获取一副牌52张扑克牌列表
@property
def cards(self):
return self._cards
# 随即洗牌:放回随机乱序52张扑克牌列表
def shuffle(self):
self._current = 0
random.shuffle(self._cards)
# 发牌:当前索引位置扑克牌
@property
def next(self):
card = self._cards[self._current] # 去除当前索引位置扑克牌
self._current += 1 # 当前序列索引先后移动一个位置
return card
# 还有没有牌:True表示还有牌,False表示没有
@property
def has_next(self):
return self._current < len(self._cards)
# 玩家类
class Player(object):
# 构造方法
def __init__(self, name):
self._name = name
self._cards_on_hand = []
# 取出玩家姓名
@property
def name(self):
return self._name
# 取出玩家手里的牌,返回13张牌的花色点数
@property
def cards_on_hand(self):
index = 0 # 索引
res = '[' # 返回字符串
# 13张扑克牌的花色点数以字符串拼接,以”,“隔开
for card in self._cards_on_hand:
index += 1
if index < 13:
res += card.getstrInfo() + ','
else:
res += card.getstrInfo()
res += ']'
return res
def get(self, card):
"""摸牌"""
self._cards_on_hand.append(card)
def arrange(self, card_key):
"""玩家整理手上的牌"""
self._cards_on_hand.sort(key=card_key)
def get_key(card):
return card.suite, card.face
def main():
p = Poker() # 生成一副扑克牌对象
p.shuffle() # 洗牌
players = [Player('A'), Player('B'), Player('C'), Player('D')] # 生成四个玩家
# 对4个玩家发牌
for _ in range(13):
for player in players:
player.get(p.next)
# 打印每个玩家手里扑克牌的花色、点数
for player in players:
print(player.name + ':', end=' ')
# print(player.cards_on_hand)
player.arrange(get_key)
print(player.cards_on_hand)
if __name__ == '__main__':
main()
五、结语
不知不觉两万字了,也不知道会不会有人全部看完,希望这篇博客能帮助到别人吧。