将学习:
安装教程:https://www.zhihu.com/question/58033789
1.创建工作目录:多级
import os
#创建多级目录
os.makedirs('D:\\培训课程\\python\\ke')
#import os
#获取当前工作目录
>>>os.getcwd()
#更改当前工作目录
>>>os.chdir('D:\\培训课程\\python\\ke')
>>>os.getcwd()
有时候执行文件需要在适当的目录下运行,这时候就需要改变或者获取工作目录了。
import os
os.chdir("/home/xx/projects/LSTM_Qi_v27/py") #修改当前工作目录
os.getcwd() #获取当前工作目录
写一个完成以下操作的脚本:
names
、assignments
和 grades
列表。下面是在终端内成功运行该脚本的示例。
names = input("Enter names separated by commas: ").title().split(",")
assignments = input("Enter assignment counts separated by commas: ").split(",")
grades = input("Enter grades separated by commas: ").split(",")
message = "Hi {},\n\nThis is a reminder that you have {} assignments left to \
submit before you can graduate. You're current grade is {} and can increase \
to {} if you submit all assignments before the due date.\n\n"
for name, assignment, grade in zip(names, assignments, grades):
print(message.format(name, assignment, grade, int(grade) + int(assignment)*2))
我们可以使用内置函数 input
获取用户的原始输入,该函数接受一个可选字符串参数,用于指定在要求用户输入时向用户显示的消息。
name = input("Enter your name: ")
print("Hello there, {}!".format(name.title()))
这段代码提示用户输入姓名,然后在问候语中使用该输入。input
函数获取用户输入的任何内容并将其存储为字符串。如果你想将输入解析为字符串之外的其他类型,例如整数(如以下示例所示),需要用新的类型封装结果并从字符串转换为该类型。
num = int(input("Enter an integer"))
print("hello" * num)
我们还可以使用内置函数 eval
将用户输入解析为 Python 表达式。该函数会将字符串评估为一行 Python 代码。
result = eval(input("Enter an expression: "))
print(result)
如果用户输入 2 * 3
,输出为 6
。
我们可以使用 try 语句处理异常。你可以使用 4 个子句(除了视频中显示的子句之外还有一个子句)。
try
:这是 try
语句中的唯一必需子句。该块中的代码是 Python 在 try
语句中首先运行的代码。except
:如果 Python 在运行 try
块时遇到异常,它将跳到处理该异常的 except
块。else
:如果 Python 在运行 try
块时没有遇到异常,它将在运行 try
块后运行该块中的代码。finally
:在 Python 离开此 try
语句之前,在任何情形下它都将运行此 finally
块中的代码,即使要结束程序,例如:如果 Python 在运行 except
或 else
块中的代码时遇到错误,在停止程序之前,依然会执行此finally
块。为何在 Python 中需要 finally
子句?
我们实际上可以指定要在 except
块中处理哪个错误,如下所示:
try:
# some code
except ValueError:
# some code
现在它会捕获 ValueError 异常,但是不会捕获其他异常。如果我们希望该处理程序处理多种异常,我们可以在 except
后面添加异常元组。
try:
# some code
except (ValueError, KeyboardInterrupt):
# some code
或者,如果我们希望根据异常执行不同的代码块,可以添加多个 except
块。
try:
# some code
except ValueError:
# some code
except KeyboardInterrupt:
# some code
现在运行下面的代码将在第二次调用 handle_zero
函数时导致错误,因为它遇到了 ZeroDivisionError 异常。
请修改下面的函数以处理该异常。如果在函数的第一行遇到该异常,应该输出警告消息并返回空列表。否则,应该运行函数的剩余代码。最后,该函数应该始终输出返回了多少组。
def create_groups(items, num_groups):
size = len(items) // num_groups
groups = []
for i in range(0, len(items), size):
groups.append(items[i:i + size])
print("{} groups returned.".format(num_groups))
return groups
print("Creating 6 groups...")
for group in create_groups(range(32), 6):
print(list(group))
print("\nCreating 0 groups...")
for group in create_groups(range(32), 0):
print(list(group))
修改上面的脚本以处理除以零错误。正确修改的话,应该会输出:
Creating 6 groups...
6 groups returned.
[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[10, 11, 12, 13, 14]
[15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]
[25, 26, 27, 28, 29]
[30, 31]
Creating 0 groups...
WARNING: Returning empty list. Please use a nonzero number.
0 groups returned.
def create_groups(items, num_groups):
try:
size = len(items) // num_groups
except ZeroDivisionError:
print("WARNING: Returning empty list. Please use a nonzero number.")
return []
else:
groups = []
for i in range(0, len(items), size):
groups.append(items[i:i + size])
return groups
finally:
print("{} groups returned.".format(num_groups))
print("Creating 6 groups...")
for group in create_groups(range(32), 6):
print(list(group))
print("\nCreating 0 groups...")
for group in create_groups(range(32), 0):
print(list(group))
在处理异常时,依然可以如下所示地访问其错误消息:
try:
# some code
except ZeroDivisionError as e:
# some code
print("ZeroDivisionError occurred: {}".format(e))
应该会输出如下所示的结果:
ZeroDivisionError occurred: division by zero
因此依然可以访问错误消息,即使已经处理异常以防止程序崩溃!
如果没有要处理的具体错误,依然可以如下所示地访问消息:
try:
# some code
except Exception as e:
# some code
print("Exception occurred: {}".format(e))
Exception
是所有内置异常的基础类。你可以在此处详细了解
以下是如何在 Python 中读写文件的方式。
f = open('my_path/my_file.txt', 'r')
file_data = f.read()
f.close()
open
打开文件。需要文件路径字符串。open
函数会返回文件对象,它是一个 Python 对象,Python 通过该对象与文件本身交互。在此示例中,我们将此对象赋值给变量 f
。open
函数中指定可选参数。参数之一是打开文件时采用的模式。在此示例中,我们使用 r
,即只读模式。这实际上是模式参数的默认值。read
访问文件对象的内容。该 read
方法会接受文件中包含的文本并放入字符串中。在此示例中,我们将该方法返回的字符串赋值给变量 file_data
。close
方法释放该文件占用的系统资源。f = open('my_path/my_file.txt', 'w')
f.write("Hello there!")
f.close()
Python 提供了一个特殊的语法,该语法会在你使用完文件后自动关闭该文件。
with open('my_path/my_file.txt', 'r') as f:
file_data = f.read()
该 with
关键字使你能够打开文件,对文件执行操作,并在缩进代码(在此示例中是读取文件)执行之后自动关闭文件。现在,我们不需要调用 f.close() 了!你只能在此缩进块中访问文件对象 f。
f.read()
调用没有传入参数。它自动变成从当前位置读取文件的所有剩余内容,即整个文件。如果向 .read()
传入整型参数,它将读取长度是这么多字符的内容,输出所有内容,并使 'window' 保持在该位置以准备继续读取
with open(camelot.txt) as song:
print(song.read(2))
print(song.read(8))
print(song.read())
输出:
We
're the
knights of the round table
We dance whenever we're able
这样的话,在打开的文件中到处移动会很困难,因为没有太多可以导航的标记。
文本块中的 \n
是换行符。换行符表示一行的结束,告诉程序(例如文本编辑器)转到下一行。但是,对于文件中的一系列字符来说,\n
只是另一个字符。 幸运的是,Python 知道这些是特殊字符,你可以要求 Python 每次读取一行。我们来试试!
很方便的是,Python 将使用语法 for line in file
循环访问文件中的各行内容。 我可以使用该语法创建列表中的行列表。因为每行依然包含换行符,因此我使用 .strip()
删掉换行符。
camelot_lines = []
with open("camelot.txt") as f:
for line in f:
camelot_lines.append(line.strip())
print(camelot_lines)
输出:
["We're the knights of the round table", "We dance whenever we're able"]
你将创建一个演员名单,列出参演电视剧《巨蟒剧团之飞翔的马戏团》的演员。
写一个叫做 create_cast_list
的函数,该函数会接受文件名作为输入,并返回演员姓名列表。 它将运行文件 flying_circus_cast.txt
(信息收集自 imdb.com)。文件的每行包含演员姓名、逗号,以及关于节目角色的一些(凌乱)信息。你只需提取姓名,并添加到列表中。你可以使用 .split()
方法处理每行。
def create_cast_list(filename):
cast_list() = []
with open(filename) as f :
for line in f:
line_date = line.split(',')
cast_list.append(line_date[0])
return(cast_list)
cast_list = create_cast_list('flying_circus_cast.txt')
for actor in cast_list:
print(actor)
我们实际上可以导入其他脚本中的 Python,如果你处理的是大型项目,需要将代码整理成多个文件并重复利用这些文件中的代码,则导入脚本很有用。如果你要导入的 Python 脚本与当前脚本位于同一个目录下,只需输入 import
,然后是文件名,无需扩展名 .py。
import useful_functions
Import
语句写在 Python 脚本的顶部,每个导入语句各占一行。该 import
语句会创建一个模块对象,叫做 useful_functions
。模块是包含定义和语句的 Python 文件。要访问导入模块中的对象,需要使用点记法。
import useful_functions
useful_functions.add_five([1, 2, 3, 4])
我们可以为导入模块添加别名,以使用不同的名称引用它。
import useful_functions as uf
uf.add_five([1, 2, 3, 4])
if main
块为了避免运行从其他脚本中作为模块导入的脚本中的可执行语句,将这些行包含在 if __name__ == "__main__"
块中。或者,将它们包含在函数 main() 中并在 if main
块中调用该函数。
每当我们运行此类脚本时,Python 实际上会为所有模块设置一个特殊的内置变量 __name__
。当我们运行脚本时,Python 会将此模块识别为主程序,并将此模块的 __name__
变量设为字符串 "__main__"
。对于该脚本中导入的任何模块,这个内置 __name__
变量会设为该模块的名称。因此,条件 if __name__ == "__main__"
会检查该模块是否为主程序。
下面是我在上述视频中使用的代码。请在同一目录下创建这些脚本,并在终端里运行这些脚本!实验 if main
块并访问导入模块中的对象!
# demo.py
import useful_functions as uf
scores = [88, 92, 79, 93, 85]
mean = uf.mean(scores)
curved = uf.add_five(scores)
mean_c = uf.mean(curved)
print("Scores:", scores)
print("Original Mean:", mean, " New Mean:", mean_c)
print(__name__)
print(uf.__name__)
# useful_functions.py
def mean(num_list):
return sum(num_list) / len(num_list)
def add_five(num_list):
return [n + 5 for n in num_list]
def main():
print("Testing mean function")
n_list = [34, 44, 23, 46, 12, 24]
correct_mean = 30.5
assert(mean(n_list) == correct_mean)
print("Testing add_five function")
correct_list = [39, 49, 28, 51, 17, 29]
assert(add_five(n_list) == correct_list)
print("All tests passed!")
if __name__ == '__main__':
main()
写一个叫做 generate_password
的函数,该函数会从提供的单词文件中随机选择三个单词,并将它们连接成一个字符串。我们已经在起始代码中提供了从文件中读取数据的代码,你需要利用这些部分构建一个密码
word_file = 'words.txt'
word_list = []
with open(word_file,'r') as words:
for line in words:
word = line.strip().lower()
if 3 < len(word) < 8:
word_list.append(word)
import random
def generate_password():
return(random.choice(word_list)+random.choice(word_list)+random.choice(word_list))
def generate():
return(''.join(random.sample(word_list,3)))
print(generate_password())
print(generate())
你可以在此处浏览库文档:https://docs.python.org/3/library/
(1) datetime #哪个模块可以告诉你当前时间和日期?
(2) os #哪个模块具有更改当前工作目录的方法?
(3) csv #哪个模块可以将逗号分隔 (.csv) 文件中的每行数据读取到 Python 中?
(4) zipfile #哪个模块可以帮助我们从 zip 文件中提取所有文件?
(5) time #哪个模块可以显示代码的运行时间?
Python 标准库包含大量模块!为了帮助你熟悉那些实用的模块,我们在下面筛选了一些我们推荐的 Python 标准库模块并解释为何我们喜欢使用它们!
csv
:对于读取 csv 文件来说非常便利collections
:常见数据类型的实用扩展,包括 OrderedDict
、defaultdict
和 namedtuple
random
:生成假随机数字,随机打乱序列并选择随机项string
:关于字符串的更多函数。此模块还包括实用的字母集合,例如 string.digits
(包含所有字符都是有效数字的字符串)。re
:通过正则表达式在字符串中进行模式匹配math
:一些标准数学函数os
:与操作系统交互os.path
:os
的子模块,用于操纵路径名称sys
:直接使用 Python 解释器json
:适用于读写 json 文件(面向网络开发) 还有一些在不同情形下很有用的其他形式的 import
语句。
from module_name import object_name
from module_name import first_object, second_object
import module_name as new_name
from module_name import object_name as new_name
from module_name import *
import module_name
为了更好地管理代码,Standard 标准库中的模块被拆分成了子模块并包含在软件包中。软件包是一个包含子模块的模块。子模块使用普通的点记法指定。
子模块的指定方式是软件包名称、点,然后是子模块名称。你可以如下所示地导入子模块。
import package_name.submodule_name
独立开发者编写了成千上万的第三方库!你可以使用 pip 安装这些库。pip 是在 Python 3 中包含的软件包管理器,它是标准 Python 软件包管理器,但并不是唯一的管理器。另一个热门的管理器是 Anaconda,该管理器专门针对数据科学。
要使用 pip 安装软件包,在命令行中输入“pip install”,然后是软件包名称,如下所示:pip install package_name
。该命令会下载并安装该软件包,以便导入你的程序中。安装完毕后,你可以使用从标准库中导入模块时用到的相同语法导入第三方软件包。
requirements.txt
文件大型 Python 程序可能依赖于十几个第三方软件包。为了更轻松地分享这些程序,程序员经常会在叫做 requirements.txt 的文件中列出项目的依赖项。下面是一个 requirements.txt 文件示例。
beautifulsoup4==4.5.1
bs4==0.0.1
pytz==2016.7
requests==2.11.1
该文件的每行包含软件包名称和版本号。版本号是可选项,但是通常都会包含。不同版本的库之间可能变化不大,可能截然不同,因此有必要使用程序作者在写程序时用到的库版本。
你可以使用 pip 一次性安装项目的所有依赖项,方法是在命令行中输入 pip install -r requirements.txt
。
能够安装并导入第三方库很有用,但是要成为优秀的程序员,还需要知道有哪些库可以使用。大家通常通过在线推荐或同事介绍了解实用的新库。如果你是一名 Python 编程新手,可能没有很多同事,因此为了帮助你了解入门信息,下面是优达学城工程师很喜欢使用的软件包列表。(可能部分网站在国内网络中无法打开)
通过在终端里输入 python
启动 python 交互式解释器。你可以接着输入内容,直接与 Python 交互。这是每次实验和尝试一段 Python 代码的很棒工具。只需输入 Python 代码,输出将出现在下一行。
>>> type(5.23)
在解释器中,提示符窗口中最后一行的值将自动输出。如果有多行代码需要输出值,依然需要使用 print。
如果你开始定义函数,你将在提示符窗口中看到变化,表示这是可以继续的行。在定义函数时,你需要自己添加缩进。
>>> def cylinder_volume(height, radius):
... pi = 3.14159
... return height * pi * radius ** 2
解释器的不足之处是修改代码比较麻烦。如果你在输入该函数时出现了拼写错误,或者忘记缩进函数的主体部分,无法使用鼠标将光标点到要点击的位置。需要使用箭头键在代码行中来回移动。有必要了解一些实用的快捷方式,例如移到一行的开头或结尾。
注意,我可以引用我在解释器中之前定义的任何对象!
>>> cylinder_volume(10, 3)
282.7431
一个实用技巧是在交互式提示符窗口中使用上下箭头键循环浏览最近的命令。这样可以重新运行或修改已经尝试的代码。
要退出 Python 交互式解释器,使用命令 exit()
或在 mac/linux 上按下 ctrl+D
,在 windows 上按下 ctrl+Z
,然后按下 Enter
键。
实际上有一个代替默认 python 交互式解释器的强大解释器 IPython,它具有很多其他功能。
?
:关于对象的详细信息!
:执行系统 shell 命令