目录
1.空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。
2.一行书写多语句
Python 可以在同一行中使用多条语句,语句之间使用分号 ; 分割
#代码1
import sys; x = 'runoob'; sys.stdout.write(x + '\n')
#代码2
import sys
x = 'runoob';
sys.stdout.write(x + '\n')
#以上两代码等价
3.代码组
···代码组相当于代码块
缩进相同的一组语句构成一个代码块,我们称之代码组。
像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。
#子句开始
if requested_toppings:
#代码块开始
for requested_topping in request_toppings:
if requested_topping == 'green peppers':
print("Sorry, we are out of green peppers right now.")
else:
print("Adding "+requested_topping+".")
print("\nFinished making your pizza!")
#代码块结束
#子句结束
else:
print("Are you sure you want a plain pizza?\n")
4.print
关键字end可以用于将结果输出到同一行,或者在输出的末尾添加不同的字符
print(1,end="");print(2,end="")
print()
print(1,end=" ");print(2,end=" ")
print()
print(1,end=",");print(2,end=",")
#输出结果
'''
12
1 2
1,2,
'''
5.模块
模块是一个包含已经定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
可以自己编写一个模块,也可以引用标准库中的模块。
>>> import random
>>> random.random()
0.2419781054363922
上述代码在第一行引入了random模块,并使用了random模块的random函数。
引入random模块,实际上是引入了random.py文件。
在 python 用 import 或者 from...import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *
5.1.搜索路径
当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?搜索路径是在Python编译或安装的时候确定的,搜索路径被存储在sys模块中的path变量。
在交互式命令行中执行代码A
>>> import sys
>>> sys.path
输出结果为
['',
'E:\\software\\python3.7.8\\python37.zip',
'E:\\software\\python3.7.8\\DLLs',
'E:\\software\\python3.7.8\\lib',
'E:\\software\\python3.7.8',
'E:\\software\\python3.7.8\\lib\\site-packages']
以脚本的方式执行下列代码A,(脚本存放在桌面中)
输出结果为
['C:\\Users\\DELL\\Desktop',
'E:\\software\\python3.7.8\\python37.zip',
'E:\\software\\python3.7.8\\DLLs',
'E:\\software\\python3.7.8\\lib',
'E:\\software\\python3.7.8',
'E:\\software\\python3.7.8\\lib\\site-packages']
可见,当代码以脚本的方式执行时,搜索路径的第一个路径是脚本所在目录。
5.2
若要经常使用random函数,有三种方式可以简化调用方式
1.
from random import random
>>> random()
2.
>>> import random
>>> rand = random.random
>>> rand()
3.
>>> import random
>>> rand = random.random()
>>> rand
5.3__name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。
如果我们想在模块被引入时,主程序的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
定义test.py文件
if __name__ == '__main__': print('程序自身在运行') else: print('我来自另一模块')
运行该脚本文件
python C:\Users\DELL\Desktop\test.py
输出结果
程序自身在运行
在交互式命令行中引入test文件
>>> import test 我来自另一模块
__name__ 与 __main__ 底下是双下划线
5.4标准模块
有些模块直接被构建在解析器里,这些组件会根据不同的操作系统进行不同形式的配置,比如 winreg 这个模块就只会提供给 Windows 系统。
应该注意到这有一个特别的模块 sys ,它内置在每一个 Python 解析器中。变量 sys.ps1 和 sys.ps2 定义了主提示符和副提示符所对应的字符串:
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps1 = '-->'
-->pass
-->
-->
5.5包
目录只有包含一个叫做 __init__.py 的文件才会被认作是一个包。
6.if语句
if语句格式如下
if condition_1: #等价于if(condition_1):
statement_block_1 #注意缩进
elif condition_2:
statement_block_2
else:
statement_block_3
Python中没有switch – case语句
非零就是true,但此说法只应用在判断条件中
if中常用的操作符
#数字猜谜游戏
number = 7
guess = -1 #guess的值-1是没用的。但若不对guess赋值,将会报错
print("数字猜谜游戏!")
while guess != number:
guess = int(input("请输入你猜的数字:")) #input接收输入
if guess == number:
print("恭喜,你猜对了!")
elif guess < number:
print("猜的数字小了...")
elif guess > number:
print("猜的数字大了...")
7.循环语句
7.1while语句
while 判断条件:#注意冒号 执行语句……#注意缩进
在 Python 中没有 do..while 循环
1.无限循环
while 1 :
print(“无限循环”)
程序进入无限循环时,ctrl+c即可终止
2.while else
while <expr>: <statement(s)> else: <additional_statement(s)>
如果 while 后面的条件语句为 false 时,则执行 else 的语句块
7.2for语句
Python for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串。
for <variable> in <sequence>:
<statements>
else:
<statements>
7.3range()
如果你需要遍历数字序列,可以使用内置range()函数,它会生成数列。
range(最小数字i,最大数字j,步长)
三个参数后两个是可选的,生成的数字范围取i不取j。
1.使用range函数创建列表
>>>list(range(5))
[0, 1, 2, 3, 4]
list(seq) 是函数,目的是将元组转化为列表
7.4pass 语句
Python pass是空语句,是为了保持程序结构的完整性。
pass 不做任何事情,一般用做占位语句
>>>while True:
... pass # 等待键盘中断 (Ctrl+C)
8.迭代器与生成器
8.1迭代器
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器。
1.遍历迭代器对象
可以用for循环遍历
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end=" ")
执行结果
1 2 3 4
也可以用next()函数遍历
import sys # 引入 sys 模块
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
while True:
try:
print (next(it))
except StopIteration:
break
2. StopIteration
StopIteration 异常用于标识迭代的完成
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end=" ")
上述语句的for循环中,终止条件是遭遇 StopIteration异常。
可以通过自建迭代器进一步感悟。
3.创建迭代器
已经知道,字符串,列表,元组可用于创建迭代器。
想要让类也可用于创建迭代器,需要在类中实现两个方法 __iter__() 与 __next__() 。
__iter__() 定义迭代初始情况, __next__() 定义每次迭代产生的元素。
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
再给出一个示例
class MyIter():
def __init__(self):
#为了示例,用一个简单的列表作为需迭代的数据集合,并且私有化可视情况变为其他类型集合
self.__list1=[1,2,3,4]
self.__index=0
def __iter__(self):
#该魔法方法,必须返回一个迭代器对象,如果self已经定义了__next__()魔法方法,则只需要返回self即可
#因为如上面所述,生成器一定是迭代器
return iter(self.list1)
def __next__(self):
#此处的魔法函数,python会自动记忆每次迭代的位置,无需再使用yield来处理
#在使用next(obj)时,会自动调用该魔法方法
res=self.__list1[self.__index]
self.__index+=1
return res
8.2生成器
生成器比自定义迭代器类更加常用。
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
生成器是一个返回迭代器的函数。
yield有点像断点。 加了yield的函数,每次执行到有yield的时候,会返回yield后面的值 并且函数会暂停,直到下次调用或迭代终止;
使用 yield的斐波那契函数:
#!/usr/bin/python3
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
当斐波那契的参数十分大时,若想要将a所有值作为列表返回,十分消耗内存。
使用了yield的函数,返回的仅仅是一个迭代器,while循环每次执行next()时,fibonacci函数才会调用一次,得到a新的值,节省了内存。
迭代器和生成器具体应用场景,就凡是需要提升运行效率或节约内存资源,且遍历的数据是集合形式的,都可以考虑。
另外一个小众的使用场景,是变相实现协程的效果,即在同一个线程内,实现不同任务交替执行
9.函数
9.1.格式:
def 函数名(参数列表): #注意冒号 函数体 #注意缩进
函数以return表达式结束,若无return,则表面返回none
9.2..python 函数的参数传递:
-
不可变类型参数传递:类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。
-
可变类型参数传递:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
9.3.参数
函数参数的类型有
-
必需参数
-
关键字参数
-
默认参数
-
不定长参数
以printinfo函数为例
def printinfo( name, age ):
"打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
(1)调用该函数时,使用必需参数:
printinfo("lihua",25)
(2) 调用该函数时,使用关键字参数:
printinfo(age=25,name="lihua")
使用关键字参数允许函数调用时参数的顺序与声明时不一致
(3)调用该函数时,使用默认参数:
对printinfo函数作出修改,对age参数赋默认值
def printinfo( name, age=25 ):
"打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
调用函数:
printinfo("lihua")
(4)不定长参数
定义如下函数
>>>def f(a,*b):
... print(a)
... print(b)
>>> f(1,2,3,4,"xxx")#调用函数
#打印结果
'''
1
(2, 3, 4, 'xxx')
'''
参数b是不定长参数,它表示一个元组,元组可以为空。这样,调用函数时可以传入不定长参数。
若*单独出现
>>>def f(a,*):
... print(a)
... print(b)
表面该参数为一个元组,不能为空
若b前有两个*
>>>def f(a,**b):
... print(a)
... print(b)
表明b参数为一个字典
9.4.匿名函数
Python 使用 lambda 来创建匿名函数,lambda 函数的语法只包含一个语句。
设置参数 a 加上 10:
x = lambda a : a + 10
调用函数
print(x(5))
输出结果
15