0.1 Setting Up Your Environment
这是一个全面的指南,用于在您的个人计算机上设置使用Qiskit Textbook的环境。这将帮助您重现您在教科书网站上看到的结果。Qiskit Textbook是在Jupyter notebooks中编写的。Notebooks和教科书网站是仅有的两个完全支持Qiskit Textbook的媒体。
安装qiskit_textbook包
Qiskit Textbook提供了一些特定于教科书的工具和组件。这不是Qiskit的一部分,可以通过qiskit_textbook包获得。通过Pip和Git安装此包的最快方法是使用以下命令:
pip install git+https://github.com/qiskit-community/qiskit-textbook.git#subdirectory=qiskit-textbook-src
或者,您可以从Github下载qiskit-textbook-src文件夹并在包含此文件夹的目录下执行指令:
pip install ./qiskit-textbook-src
准确重现qiskit教科书中预先呈现的输出的步骤(可选)
1. 设置默认使用Matplotlib绘图
QuantumCircuit.draw()
和qiskit.visualization.circuit_drawer()
的默认后端是文本后端。然而,根据您的本地环境,您可能希望更改这些默认值,以更适合您的用例。这是通过用户配置文件完成的。默认情况下,用户的配置文件应该是位于~/.qiskit/
下的settings.conf
文件。
Qiskit Textbook默认使用Matplotlib库绘制电路。要重现Qiskit Textbook中给出的可视化效果,请创建一个名为settings.conf
文件(通常在~/.qiskit/
中找到),内容如下:
[default]
circuit_drawer = mpl
2. 设置默认图像格式为SVG
根据需要,您可以将下面这行代码行添加到ipython_kernel_config.py
文件(通常在~/.ipython/profile_default/
中找到),以将默认图像格式从PNG设置为扩展性更好的SVG格式:
c.InlineBackend.figure_format = 'svg'
3. 同步教科书中使用的Qiskit版本
您将在大多数教程的末尾找到一个代码片段,其中包含本教程中使用的qiskit包的版本信息。如果您发现语法和/或输出与教程不一致,请尝试使用相同的版本。
想要检查您当前计算机中安装的版本,请在Python shell或Jupyter Notebook中运行以下命令:
import qiskit.tools.jupyter
%qiskit_version_table
0.2 Python and Jupyter Notebooks
Python是一种不需要编译的编程语言。您可以逐行运行它(这就是我们在notebook中使用它的方式)。因此,如果您是编程新手,Python是一个很好的开始。当前版本是Python 3,也就是我们在这里要使用的版本。
用Python编写代码的一种方法是使用Jupyter notebook。这可能是将编程、文本和图像结合起来的最佳方式。在notebook里,所有内容都在单元格中。文本单元格和代码单元格是最常见的。如果您正在使用Jupyter notebook阅读本节内容,则您目前阅读的文本正位于文本单元格中。您可以在下面找到一个代码单元格。
要运行代码单元格的内容,可以单击它并按Shift + Enter。如果左边有一个小箭头,您点击它也可以运行。
1 + 1
2
如果您正在使用Jupyter notebook阅读本节内容,请在阅读过程中执行每个代码单元格。
a = 1
b = 0.5
a + b
1.5
上面我们创建了两个变量,我们称之为a
和b
,并给它们赋值。然后我们把它们相加。在Python中,像这样简单的算术运算非常简单。
Python中的变量有很多种形式。下面是一些例子。
an_integer = 42 # 一个整数
a_float = 0.1 # 一个具有固定精度的非整数
a_boolean = True # 一个可以是True或False的值
a_string = '''just enclose text between two 's, or two "s, or do what we did for this string''' # 文本
none_of_the_above = None # 没有任何实际的值或变量类型
除了数字,我们可以使用的另一种数据结构是列表。
a_list = [0,1,2,3]
Python中的列表可以包含任意类型的变量。
a_list = [ 42, 0.5, True, [0,1], None, 'Banana' ]
在Python中,列表索引从0开始(与Fortran等语言不同)。因此,以下是您如何访问上述列表开头的42。
a_list[0]
42
类似的数据结构是元组(tuple)。
a_tuple = ( 42, 0.5, True, [0,1], None, 'Banana' )
a_tuple[0]
42
列表和元组的一个主要区别是列表元素可以更改,
a_list[5] = 'apple'
print(a_list)
[42, 0.5, True, [0, 1], None, ‘apple’]
而元组元素不能更改。
a_tuple[5] = 'apple'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-42d08f1e5606> in <module>
----> 1 a_tuple[5] = ‘apple’
TypeError: ‘tuple’ object does not support item assignment
此外,我们可以在列表的末尾添加一个元素,这是元组不能做的。
a_list.append( 3.14 )
print(a_list)
[42, 0.5, True, [0, 1], None, ‘apple’, 3.14]
另一个有用的数据结构是字典。它存储了一组值,每个值都由唯一的键标记。
值可以是任何数据类型。键可以是任何足够简单的值(整数、浮点数、布尔值、字符串)。它不能是列表,但可以是元组。
a_dict = { 1:'This is the value, for the key 1', 'This is the key for a value 1':1, False:':)', (0,1):256 }
通过键可以访问值。
a_dict['This is the key for a value 1']
1
只要为新键提供新值,就可以添加新的键/值对。
a_dict['new key'] = 'new_value'
想要遍历一定范围内的数字,语法如下:
for j in range(5):
print(j)
0
1
2
3
4
注意,range(n)
函数(默认)从0开始,至n-1结束。
您也可以循环任何“可迭代”对象,例如列表
for j in a_list:
print(j)
42
0.5
True
[0, 1]
None
apple
3.14
或字典。
for key in a_dict:
value = a_dict[key]
print('key =',key)
print('value =',value)
print()
key = 1
value = This is the value, for the key 1
key = This is the key for a value 1
value = 1
key = False
value =
key = (0, 1)
value = 256
key = new key
value = new_value
条件语句由if
、elif
和else
组成,语法如下。
if 'strawberry' in a_list:
print('We have a strawberry!')
elif a_list[5]=='apple':
print('We have an apple!')
else:
print('Not much fruit here!')
We have an apple!
导入包可以使用如下一行代码完成。
import numpy
numpy
包对于处理数学问题很重要
numpy.sin( numpy.pi/2 )
1.0
我们必须在每个numpy命令前面加上numpy.
,以便它知道如何找到numpy
中定义的命令。为了节省书写,通常使用如下方式:
import numpy as np
np.sin( np.pi/2 )
1.0
接下来您只需要使用缩写的名字。大多数人使用np
,但您可以选择您喜欢的。
您也可以直接从numpy
中获取所有内容
from numpy import *
然后,您可以直接使用这些命令。但这可能会导致包之间相互干扰,所以要谨慎使用。
sin( pi/2 )
1.0
如果您想做三角函数、线性代数等,您可以使用numpy
。绘图使用matplotlib
。对于图论,请使用networkx
。对于量子计算,请使用qiskit
。无论您想要什么,大概都会有一个包来帮助您。
在任何语言中,都需要了解如何创建函数。
下面是一个函数,它的名字被选为do_some_maths
,它的输入名为Input1
和Input2
,输出名为the_answer
。
def do_some_maths ( Input1, Input2 ):
the_answer = Input1 + Input2
return the_answer
它的用法如下:
x = do_some_maths(1,72)
print(x)
73
如果您给某个函数一个对象,这个函数调用这个对象的方法来改变它的状态,那么这个效果会持续存在。如果这就是您要做的,您不需要返回任何内容。例如,让我们使用列表的append
方法来实现它。
def add_sausages ( input_list ):
if 'sausages' not in input_list:
input_list.append('sausages')
print('List before the function')
print(a_list)
add_sausages(a_list) # function called without an output
print('\nList after the function')
print(a_list)
List before the function
[42, 0.5, True, [0, 1], None, ‘apple’, 3.14]
List after the function
[42, 0.5, True, [0, 1], None, ‘apple’, 3.14, ‘sausages’]
随机性可以使用random
包生成。
import random
for j in range(5):
print('* Results from sample',j+1)
print('\n Random number from 0 to 1:', random.random() )
print("\n Random choice from our list:", random.choice( a_list ) )
print('\n')
* Results from sample 1
Random number from 0 to 1: 0.9565207808448243
Random choice from our list: 3.14
* Results from sample 2
Random number from 0 to 1: 0.2965136670559021
Random choice from our list: sausages
* Results from sample 3
Random number from 0 to 1: 0.5742595097667611
Random choice from our list: 3.14
* Results from sample 4
Random number from 0 to 1: 0.8530438802121619
Random choice from our list: True
* Results from sample 5
Random number from 0 to 1: 0.1329354419675386
Random choice from our list: None
这些是基础知识。现在您所需要的只是一个搜索引擎,以及知道谁值得在Stack Exchange上收听的直觉。接下来您就可以用Python做任何事情了。您的代码可能不是最“Python化”的,但只有Python爱好者真正关心这一点。