10分钟学会Python

Python是互联网、数据科学、量化交易等领域使用最广泛的编程语言之一,是BigQuant主要使用的策略开发语言。

本文简短而全面,用十分钟的时间带你走入Python的大门。建议一边学习,一边在BigQuant在线开发环境里实践。

1. 语法

Python中没有强制的语句终止字符,代码块是通过缩进来指示的。缩进表示一个代码块的开始,逆缩进则表示一个代码块的结束。一般用4个空格来表示缩进。

  • 声明以冒号(:)字符结束,并且开启一个缩进级别。
  • 单行注释以井号字符(#)开头,多行注释则以多行字符串的形式出现。
  • 赋值(事实上是将对象绑定到名字)通过等号(“=”)实现
  • 双等号(“==”)用于相等判断
In [1]:
# 本行是注释
some_var = 3
print(some_var)

print(some_var == 4)

if some_var > 1:
    print('Python就是这么简单')
3
False
Python就是这么简单

2. 导入库

外部库可以使用 import [libname] 关键字来导入,也可以使用 from [libname] import [funcname] 来导入所需要的函数。例如:

In [2]:
import math
math.sqrt(25)
Out[2]:
5.0
In [3]:
from math import sqrt
sqrt(25)
Out[3]:
5.0

3. 数据类型

查看数据类型:

In [4]:
type(2)
Out[4]:
int
In [5]:
type('two')
Out[5]:
str
In [6]:
type(True)
Out[6]:
bool

类型转换:

In [7]:
float(2)
Out[7]:
2.0
In [8]:
int(2.9)
Out[8]:
2
In [9]:
str(2.9)
Out[9]:
'2.9'

4. 数学运算

In [10]:
10 + 4
Out[10]:
14
In [11]:
10 - 4
Out[11]:
6
In [12]:
10 * 4
Out[12]:
40
In [13]:
10 % 4      # 计算余数
Out[13]:
2
In [14]:
10 / 4
Out[14]:
2.5

5. 比较和布尔运算

赋值

In [15]:
x = 5

比较:

In [16]:
x > 3
Out[16]:
True
In [17]:
x >= 3
Out[17]:
True
In [18]:
x != 3
Out[18]:
True
In [19]:
x == 5
Out[19]:
True

布尔运算:

In [20]:
# and:与
5 > 3 and 6 > 3
Out[20]:
True
In [21]:
# or:或
5 > 3 or 5 < 3
Out[21]:
True
In [22]:
# not:非
not False
Out[22]:
True

6. 条件表达式

In [23]:
# if 语句
if x > 0:
    print('positive')
positive
In [24]:
# if/else 语句
if x > 0:
    print('positive')
else:
    print('zero or negative')
positive
In [25]:
# if/elif/else 语句
if x > 0:
    print('positive')
elif x == 0:
    print('zero')
else:
    print('negative')
positive

7. 列表

  • 列表的特点: 有序,可迭代,可变,可以包含多个数据类型

创建列表

In [26]:
# 两种创建空列表的方法如下
empty_list = []
empty_list = list()
In [27]:
# 创建列表
simpsons = ['homer', 'marge', 'bart']

获取列表数据:

In [28]:
# 列表的第0个元素(列表的下标从0开始,这和C语言等一致)
simpsons[0]
Out[28]:
'homer'
In [29]:
# 列表元素个数
len(simpsons)
Out[29]:
3

列表方法:

In [30]:
# 在尾部追加,操作符+=完成同样的功能
simpsons.append('lisa')
simpsons
Out[30]:
['homer', 'marge', 'bart', 'lisa']
In [31]:
# 在尾部追加多个元素
simpsons.extend(['itchy', 'scratchy'])
simpsons
Out[31]:
['homer', 'marge', 'bart', 'lisa', 'itchy', 'scratchy']
In [32]:
# 在索引位置处将数据项插入列表
simpsons.insert(0, 'maggie')
simpsons
Out[32]:
['maggie', 'homer', 'marge', 'bart', 'lisa', 'itchy', 'scratchy']
In [33]:
# 列表从左往右搜索第一个出现的元素,并移除
simpsons.remove('bart')
simpsons
Out[33]:
['maggie', 'homer', 'marge', 'lisa', 'itchy', 'scratchy']
In [34]:
# 替代列表第一个元素
simpsons[0] = 'krusty'
simpsons
Out[34]:
['krusty', 'homer', 'marge', 'lisa', 'itchy', 'scratchy']
In [35]:
# 统计元素出现次数
simpsons.count('lisa')
Out[35]:
1
In [36]:
# returns index of first instance
simpsons.index('itchy')
Out[36]:
4

列表切片:

In [37]:
weekdays = ['mon', 'tues', 'wed', 'thurs', 'fri']
In [38]:
# 第一个元素,索引值为0
weekdays[0]
Out[38]:
'mon'
In [39]:
# 前三个元素,索引值为0、1、2,,其中0可以省略
print(weekdays[0:3] == weekdays[:3])
weekdays[0:3]
True
Out[39]:
['mon', 'tues', 'wed']
In [40]:
# 从索引值为3的元素的位置到最后位置的元素
weekdays[3:]
Out[40]:
['thurs', 'fri']
In [41]:
# 最后一个元素
weekdays[-1]
Out[41]:
'fri'
In [42]:
# 每隔两个元素进行存取
weekdays[::2]
Out[42]:
['mon', 'wed', 'fri']
In [43]:
# 反转列表,等价于list(reversed(weekdays))
weekdays[::-1]
Out[43]:
['fri', 'thurs', 'wed', 'tues', 'mon']
In [44]:
# 对列表进行排序 (原地修改列表但不返回列表)
simpsons.sort()
simpsons
Out[44]:
['homer', 'itchy', 'krusty', 'lisa', 'marge', 'scratchy']
In [45]:
# 反向排序
simpsons.sort(reverse=True)
simpsons
Out[45]:
['scratchy', 'marge', 'lisa', 'krusty', 'itchy', 'homer']
In [46]:
# 根据传入的规则排序,以长度为例
simpsons.sort(key=len)
simpsons
Out[46]:
['lisa', 'marge', 'itchy', 'homer', 'krusty', 'scratchy']
In [47]:
# 返回已排序列表(并不修改原列表),可以传入排序规则:
simpsons = [ 'krusty', 'itchy', 'scratchy', 'lisa']
sorted(simpsons, key=len)
Out[47]:
['lisa', 'itchy', 'krusty', 'scratchy']
In [48]:
# 对象引用
num = [10,20,30,40,50]
same_num = num
In [49]:
# 会同时修改两个对象
same_num[0] = 0
print(num)
print(same_num)
[0, 20, 30, 40, 50]
[0, 20, 30, 40, 50]
In [50]:
# 检查是否是同一个对象
num is same_num
Out[50]:
True
In [51]:
# 判断两个对象是否相等
num == same_num
Out[51]:
True

8. 元组

  • 元组性质: 有序,可迭代,不可变,可以包含多个数据类型
  • 类似于列表, 但不可变
In [52]:
# 直接创建一个元组
digits = (0, 1, 'two')
In [53]:
# 将列表转化为元组
digits = tuple([0, 1, 'two'])
In [54]:
# 元组第三个位置的元素
digits[2]
Out[54]:
'two'
In [55]:
# 元组长度
len(digits)
Out[55]:
3
In [56]:
# 统计元组中元素出现的次数
digits.count('two')
Out[56]:
1
In [57]:
# 返回该元素第一次出现的索引值
digits.index(1)
Out[57]:
1
In [58]:
# 元组不可修改,下面语句会报错
# digits[2] = 2

9. 字符串

  • 字符串性质: 可迭代,不可变
In [59]:
# 创建字符串
s = 'I like you'
In [60]:
# 字符串切片
s[0]
Out[60]:
'I'
In [61]:
# 长度
len(s)
Out[61]:
10

字符串切片类似于列表切片:

In [62]:
s[:6]
Out[62]:
'I like'
In [63]:
s[7:]
Out[63]:
'you'
In [64]:
s[-1]
Out[64]:
'u'

字符串方法 (并不修改原字符串):

In [65]:
s.lower()
Out[65]:
'i like you'
In [66]:
s.upper()
Out[66]:
'I LIKE YOU'
In [67]:
s.startswith('I')
Out[67]:
True
In [68]:
s.endswith('you')
Out[68]:
True
In [69]:
# 返回在字符串中的最左位置,如果没有找到,就返回-1
s.find('like')
Out[69]:
2
In [70]:
# 字符串替换
s.replace('like', 'love')
Out[70]:
'I love you'

字符串分割:

In [71]:
# 返回一个被空白字符分割的字符串列表
s.split(' ')
Out[71]:
['I', 'like', 'you']
In [72]:
# 返回一个被特定字符分割的字符串列表
s2 = 'a, an, the'
s2.split(',')
Out[72]:
['a', ' an', ' the']
In [73]:
# 字符串拼接
stooges = ['larry', 'curly', 'moe']
' '.join(stooges)
Out[73]:
'larry curly moe'
In [74]:
# + 也可作字符串拼接
s3 = 'The meaning of life is'
s4 = '42'
s3 + ' ' + s4
Out[74]:
'The meaning of life is 42'
In [75]:
# 移除开始和结尾的空白字符
s5 = '  ham and cheese  '
s5.strip()
Out[75]:
'ham and cheese'

格式化字符串:

In [76]:
# 方法1
'raining %s and %s' % ('cats', 'dogs')
Out[76]:
'raining cats and dogs'
In [77]:
# 方法2
'raining {} and {}'.format('cats', 'dogs')
Out[77]:
'raining cats and dogs'

10. 字典

  • 字典性质: 无序,可迭代,可变,可以包含多个数据类型
  • 由键-值对组成
  • 键必须是唯一的, 可以是字符串、数字、元组
  • 值可以是任何类型

字典的键与值:

In [78]:
# 创建一个空字典(两种方法)
empty_dict = {}
empty_dict = dict()
In [79]:
# 创建字典(两种方法)
family = {'dad':'homer', 'mom':'marge', 'size':6}
family = dict(dad='homer', mom='marge', size=6)
family
Out[79]:
{'dad': 'homer', 'mom': 'marge', 'size': 6}
In [80]:
# 传入键名,获取字典键值
family['dad']
Out[80]:
'homer'
In [81]:
# 返回字典的键-值对数目
len(family)
Out[81]:
3
In [82]:
# 检查字典中是否含有某个键名
'mom' in family
Out[82]:
True
In [83]:
# 返回键名
family.keys()
Out[83]:
dict_keys(['size', 'dad', 'mom'])
In [84]:
# 返回键值
family.values()
Out[84]:
dict_values([6, 'homer', 'marge'])
In [85]:
# 返回键值对
family.items()
Out[85]:
dict_items([('size', 6), ('dad', 'homer'), ('mom', 'marge')])

修改字典:

In [86]:
# 增加一个键-值
family['cat'] = 'snowball'
family
Out[86]:
{'cat': 'snowball', 'dad': 'homer', 'mom': 'marge', 'size': 6}
In [87]:
# 编辑一个已存在的键-值
family['cat'] = 'snowball ii'
family
Out[87]:
{'cat': 'snowball ii', 'dad': 'homer', 'mom': 'marge', 'size': 6}
In [88]:
# 删除一个键-值
del family['cat']
family
Out[88]:
{'dad': 'homer', 'mom': 'marge', 'size': 6}
In [89]:
# 字典值可以是列表
family['kids'] = ['bart', 'lisa']
family
Out[89]:
{'dad': 'homer', 'kids': ['bart', 'lisa'], 'mom': 'marge', 'size': 6}
In [90]:
# 增加多个键-值
family.update({'baby':'maggie', 'grandpa':'abe'})
family
Out[90]:
{'baby': 'maggie',
 'dad': 'homer',
 'grandpa': 'abe',
 'kids': ['bart', 'lisa'],
 'mom': 'marge',
 'size': 6}

获取键值的一个更安全的方法(get):

In [91]:
# 获取字典值,等价于family['mom']
family.get('mom')
Out[91]:
'marge'
In [92]:
# 如果字典中不存在,返回一个默认值
family.get('grandma', 'not found')
Out[92]:
'not found'

11. 集合

  • 集合性质: 无序, 可迭代, 可变, 可以包含多个数据类型
  • 集合中元素是唯一的(字符串, 数字, or 元组)
  • 类似于字典,只有键名,没有键值

创建集合:

In [93]:
# 创建空集合
empty_set = set()
In [94]:
# 创建集合
languages = {'python', 'r', 'java'}
In [95]:
# 将列表转化为集合
snakes = set(['cobra', 'viper', 'python'])

集合运算:

In [96]:
# 交集
languages & snakes
Out[96]:
{'python'}
In [97]:
# 并集
languages | snakes
Out[97]:
{'cobra', 'java', 'python', 'r', 'viper'}
In [98]:
# 差集
languages - snakes
Out[98]:
{'java', 'r'}

修改集合 (并不返回集合):

In [99]:
# a增加元素
languages.add('sql')
languages
Out[99]:
{'java', 'python', 'r', 'sql'}
In [100]:
# 增加一个已存在的元素
languages.add('r')
languages
Out[100]:
{'java', 'python', 'r', 'sql'}
In [101]:
# 移除元素
languages.remove('java')
languages
Out[101]:
{'python', 'r', 'sql'}
In [102]:
# 移除所有元素
languages.clear()
languages
Out[102]:
set()

从列表中获取唯一元素的排序列表:

In [103]:
sorted(set([9, 0, 2, 1, 0]))
Out[103]:
[0, 1, 2, 9]

12. 函数

定义没有参数、没有返回值的函数:

In [104]:
def print_text():
    print('this is text')
In [105]:
# 调用函数
print_text()
this is text

定义含有一个参数、含有一个返回值的函数:

In [106]:
# 定义函数
def square_this(x):
    return x**2
In [107]:
# 调用函数
result = square_this(3)
print(result)
9

定义含有两个位置参数(非默认值)、一个关键字参数(默认值)的函数:

In [108]:
def calc(a, b, op='add'):
    if op == 'add':
        return a + b
    elif op == 'sub':
        return a - b
    else:
        print('valid operations are add and sub')
In [109]:
# 调用函数
calc(10, 4, op='add')
Out[109]:
14
In [110]:
# 通过参数位置来传入参数值
calc(10, 4, 'add')
Out[110]:
14
In [111]:
# ‘op’关键字参数为默认值
calc(10, 4)
Out[111]:
14
In [112]:
calc(10, 4, 'sub')
Out[112]:
6
In [113]:
calc(10, 4, 'div')
valid operations are add and sub

如果您尚未编写函数体,请使用pass作为占位符:

In [114]:
def stub():
    pass

函数含有两个返回值:

In [115]:
def min_max(nums):
    return min(nums), max(nums)
In [116]:
# 多个返回值可以绑定到类型为元组的变量上
nums = [1, 2, 3]
min_max_num = min_max(nums)
min_max_num
Out[116]:
(1, 3)
In [117]:
# 多个返回值绑定到多个变量上()通过元组解包的方式
min_num, max_num = min_max(nums)
print(min_num)
print(max_num)
1
3

13. 匿名(Lambda)函数

  • 主要用于临时定义由另一个函数使用的函数

定义函数:

In [118]:
# 最常见的定义函数的方法——def
def squared(x):
    return x**2
In [119]:
# 使用lambda定义函数的方法,等价于def函数定义
squared = lambda x: x**2

依据字符串最后一个元素的顺序,将字符串列表进行排序:

In [120]:
# 使用def函数定义的方法
simpsons = ['homer', 'marge', 'bart']
def last_letter(word):
    return word[-1]
sorted(simpsons, key=last_letter)
Out[120]:
['marge', 'homer', 'bart']
In [121]:
# 使用lambda函数定义的方法
sorted(simpsons, key=lambda word: word[-1])
Out[121]:
['marge', 'homer', 'bart']

14. For循环与While循环

for 循环:

In [122]:
# for循环
fruits = ['apple', 'orange']
for fruit in fruits:
    print(fruit.upper())
APPLE
ORANGE
In [123]:
# 对字典的循环,依次打印字典的键名和键值
family = {'dad':'homer', 'mom':'marge', 'size':6}
for key, value in family.items():
    print(key, value)
size 6
dad homer
mom marge
In [124]:
# 对列表的循环,依次打印列表元素的索引值和元素
for index, fruit in enumerate(fruits):
    print(index, fruit)
0 apple
1 orange

``while`` 循环:

In [125]:
count = 0
while count < 5:
    print('This will print 5 times')
    count += 1    # 等价于 'count = count + 1'
This will print 5 times
This will print 5 times
This will print 5 times
This will print 5 times
This will print 5 times

15. 生成式

列表生成式:

In [126]:
# 通过for循环获得一个列表,该列表的每个元素是原始列表对应元素的三次方
nums = [1, 2, 3, 4, 5]
cubes = []
for num in nums:
    cubes.append(num**3)
cubes
Out[126]:
[1, 8, 27, 64, 125]
In [127]:
# 使用列表生成式
cubes = [num**3 for num in nums]
cubes
Out[127]:
[1, 8, 27, 64, 125]
In [128]:
# 如果只想获得偶数值的列表
# 语法: [expression for variable in iterable if condition]
cubes_of_even = [num**3 for num in nums if num % 2 == 0]
cubes_of_even
Out[128]:
[8, 64]

集合生成式:

In [129]:
fruits = ['apple', 'banana', 'cherry']
unique_lengths = {len(fruit) for fruit in fruits}
unique_lengths
Out[129]:
{5, 6}

字典生成式:

In [130]:
fruit_lengths = {fruit:len(fruit) for fruit in fruits}
fruit_lengths
Out[130]:
{'apple': 5, 'banana': 6, 'cherry': 6}
In [131]:
fruit_indices = {fruit:index for index, fruit in enumerate(fruits)}
fruit_indices
Out[131]:
{'apple': 0, 'banana': 1, 'cherry': 2}

16. FAQ

1. 应该学Python 2 还是 Python 3?

如果你还在问这个问题,选择Python 3。Python 3已经被广泛支持和使用,Python 2的程序可以通过 2to3 转换为Python 3。对初学者来说,Python 2和3区别不大。BigQuant的策略开发语言是Python 3。


Generated by nbsphinx from a Jupyter notebook. [a reference-style link][mylink]