Python 系统总结与快速入门(1)

作为一名java程序猿,一直想搞搞python,却从来都是学了忘,忘了学。
在网上看了廖雪峰老师的教程,觉得还是很不错的,有兴趣的可以去看看。
基于上面的教程,做了个简单的提纲,便于自己回忆。

  • 基础
    • 数据结构
    • 字符编码
    • List与truple
      • list abc
      • truple abc
    • 执行逻辑
    • dict与set
      • dict
      • set
      • 其他
    • 函数
      • 参数
      • 递归与溢出
    • 其他特性
      • 切片
      • 迭代
      • 列表生成
      • 生成器
      • 迭代器
    • 函数式编程
      • 概述
      • 高阶函数
        • mapreduce
        • filter
        • sort
      • 返回函数与懒加载
      • 装饰器
      • 偏函数
  • 模块
    • 作用域
    • 模块安装
    • 模块搜索
  • 面向对象
  • IO
  • 进程
  • 模块
  • Web开发

基础

数据结构

整型
浮点数
字符串
空值 ⇒ none
变量 ⇒ 引用关系
常量 ⇒ 全部大写的变量名表示常量(习惯)
除法 ⇒ 注意 **/** 与 **//** 的区别

字符编码

ASCII ⇒ GB2312 ⇒ Unicode ⇒ UTF-8
ASCII同时也是UTF-8的一种
计算机内存统一使用Unicode,当要存储或传输,转为UTF-8
浏览网页时,服务器将Unicode转为UTF-8传输到客户端
在Python中,字符串以Unicode编码
在编写代码时候,为了避免中文乱码,可以指定为UTF-8

!/usr/bin/env python3
-- coding: utf-8 --

List与truple

list [a,b,c]

可以增删修改元素,append() pop() len()

truple (a,b,c)

一旦初始化则不能修改,但其实不能变的只是结构,具体引用的内容时可变的,换句话说只是元素指向不变

执行逻辑

if...elif..else
while
for..in..
break, continue

dict与set

dict

定义:d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
get(用get,当不存在时不会报错) pop 方法

set

定义:s = set([1, 2, 3])
add remove

其他

 input()获取的是string对象,如果需要处理还需转换

函数

定义函数 def, 空函数时可用pass,输入参数类型检测可以用isinstance(x, (int, float))。返回多个值时 return a,b 实际返回truple的对象

参数

默认参数,注意***默认参数必须指向不可变对象***,因为在函数定义时默认参数的值已经被计算出,如果函数改变了参数的值,在下一次调用时这个值也会是被改变的。
可变参数,def calc(*numbers) 。当需要将list或者truple传入,则在她们前面加\*即可。
关键字参数,def person(name, age, **kw)。kw传入key-value对。
命名关键字参数,如果要限制关键字参数的名字,就可以用命名关键字参数,def person(name, age, *, city, job),\*后面的参数被视为命名关键字参数。
参数组合,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

def f1(a, b, c=0, *args, **kw):
print(‘a =’, a, ‘b =’, b, ‘c =’, c, ‘args =’, args, ‘kw =’, kw)
def f2(a, b, c=0, *, d, **kw):
print(‘a =’, a, ‘b =’, b, ‘c =’, c, ‘d =’, d, ‘kw =’, kw)

递归与溢出

其他特性

切片

迭代

for...in...。dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。用isinstance('abc', Iterable)判断是否可进行迭代。for i, value in enumerate(['A', 'B', 'C']) 可以对下标进行迭代

列表生成

[x * x for x in range(1, 11) if x % 2 == 0]。其实已经比较类似java8的特性了。、

生成器

用来处理无限循环的类型
1. 把列表生成的[]换成(), g = (x * x for x in range(10)), next(g)或者for n in g
2. 函数return改为yield

迭代器

注意使用迭代器是不知道迭代对象的长度,只能通过不断next来寻找。

函数式编程

(这里已经非常类似java8了)

概述

变量可以指向函数,通过变量名即可调用函数。
函数名同时也是变量,可以作为参数传递。
函数可以接受函数为变量。
def add(x, y, f):
    return f(x) + f(y)

f=abs  #求绝对值

高阶函数

lambda表达式,匿名函数,下面例子多为lambda表达式。

map/reduce

from functools import reduce
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
reduce(add, [1, 3, 5, 7, 9])

###########

def char2num(s):
    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))

filter

    print(list(filter(lambda x:x>3, [1,2,3,4,5])))

sort

    sorted([36, 5, -12, 9, -21], key=abs)
    sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
    sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)

返回函数与懒加载

函数不需要立即求值,需要在后面的计算中进行求值,所以函数的返回值是一个函数。换言之,函数调用两次才出结果
    def lazy_sum(*args):
        def sum():
            ax = 0
            for n in args:
                ax = ax + n
            return ax
        return sum

    f = lazy_sum(1, 3, 5, 7, 9) # 此时返回一个函数
    f() # 此时计算最终结果
当返回函数包含内部变量时,返回函数的内部变量还会被新函数所使用。
返回函数时,计算并未执行,而是调用到最终函数才会执行。

装饰器

这部分我觉得还是挺好玩的。wrapper函数是封装函数。
封装函数需要被定义为wrapper函数。
wrapper的参数定义应该是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。
如果需要装饰器decorator本身有参数传入,则需要编写一个返回decorator的高阶函数。
    #函数添加内容
    def showName(func):
        def wrapper():
            print("Before function exec: ")
            return func()
        return wrapper

    # 通过注解使用装饰起
    @showName
    def func():
        print("Function execution")

    #decorator传入参数
    def log(text):
        def decorator(func):
                print("This is "+ text + "log \nFunction is:" +func.__name__)
                def wrapper():
                        print("This is wrapper")
                        return func();
                return wrapper
        return decorator

    @log('rudi')
    def fun():
        print("Function execution")

    fun()

偏函数

functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单
 import functools
 # 传函数,给参数
 int2 = functools.partial(int, base=2)

模块

作用域

类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;

类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;

也就是说__XXX的函数是private函数。
# 通过调用greeting函数调用内部private函数
def _private_1(name):
    return 'Hello, %s' % name

def _private_2(name):
    return 'Hi, %s' % name

def greeting(name):
    if len(name) > 3:
        return _private_1(name)
    else:
        return _private_2(name)

模块安装

pip install Pillow
其他常用的第三方库还有MySQL的驱动:mysql-connector-python
用于科学计算的NumPy库:numpy
用于生成文本的模板工具Jinja2

模块搜索

1. 一是直接修改sys.path,添加要搜索的目录:
    import sys
    sys.path.append('/Users/michael/my_py_scripts')
2. 设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。

面向对象

IO

进程

模块

Web开发

你可能感兴趣的:(python)