Table of Contents


Python学习

jupyter插件

工具

  • Python Handout
    • Turn Python scripts into handouts with Markdown and figures

jupyter notebook 增加kernel

假设python环境名为python35,执行下面命令添加该环境下的kernel

pip install ipykernel python -m ipykernel install –name python35

Python在Terminal中的自动补全

为了在 Terminal 中使用 Python 更加方便,在 home 目录下添加脚本 .pythonstartup,内容如下,

然后在 .bashrc 中添加 export PYTHONSTARTUP=~/.pythonstartup

这样就能在 Terminal 中使用 Tab 实现 Python 的自动补全了。

#!/usr/bin/python
#
#-----------------------------------------------------------------------------
#
# Usage: 
#   - rename this file to ".pythonstartup"
#   - put it under your home directory, e.g. "~"
#   - modify .bashrc, add following line,
#       export PYTHONSTARTUP=~/.pythonstartup
#
#-----------------------------------------------------------------------------

import readline
import rlcompleter
import atexit
import os

# tab completion
readline.parse_and_bind('tab: complete')
# history file
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass

atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter

Python语法

Python中append和extend的区别

  • list.append(object) 向列表中添加一个对象object
  • list.extend(sequence) 把一个序列seq的内容添加到列表中

python函数: 形参中的 *args 和 **kwargs

*args:(表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现)

示例:

def foo(x, *args):
    print(x)
    print(args)

foo(1, 2, 3, 4, 5) # 其中的2,3,4,5都给了args

"""
output:
    1
    (2, 3, 4, 5)
"""

**kwargs:(表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现)

示例:

def foo(x, **kwargs):
    print(x)
    print(kwargs)

foo(1, y=1, a=2, b=3, c=4) # 将y=1, a=2, b=3, c=4以字典的方式给了kwargs

"""
output:
    1
    {'y': 1, 'a': 2, 'b': 3, 'c': 4}
"""

Python 直接赋值、浅拷贝和深度拷贝解析

  • 直接赋值: 其实就是对象的引用(别名)
  • 浅拷贝(copy): 拷贝父对象,不会拷贝对象的内部的子对象
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象

字典浅拷贝实例

>>> a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

深度拷贝需要引入copy模块

>>> import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})

python的方法和属性私有化:单下划线,双下划线

  • xx: 公有变量
  • _x: 单前置下划线,私有化属性或方法,禁止通过from modules import *导入,但是类对象和子类可以访问
  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到),类对象和子类不能访问
  • xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 尽量不要自定义这种形式的。
  • xx_:单后置下划线,用于避免与Python关键词的冲突

axis = 0/1/-1

  • axis=0:在第一维操作
  • axis=1:在第二维操作
  • axis=-1:在最后一维操作

np.argmax()函数为例:

>>> a = np.arange(24).reshape(2,3,4)
>>> a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> np.argmax(a,axis = 0)  #返回尺寸(3,4)
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])
>>> np.argmax(a,axis = 1) #返回尺寸(2,4)
array([[2, 2, 2, 2],
       [2, 2, 2, 2]])
>>> np.argmax(a,axis = -1) #返回尺寸(2,3) 
array([[3, 3, 3],
       [3, 3, 3]])