python基础总结

来源:互联网 发布:mysql 转unix时间戳 编辑:程序博客网 时间:2024/05/22 15:33

    python技术网站:

廖雪峰的官网:http://www.liaoxuefeng.com/

python example 1 from github :https://github.com/adaptives/python-examples

python data science introductory : https://github.com/katychuang/python-data-sci-basics

the python tutorial : https://docs.python.org/3.3/tutorial/index.html

python资料汇集 :http://www.cnblogs.com/lanxuezaipiao/p/3543658.html

python idiom : http://safehammad.com/downloads/python-idioms-2014-01-16.pdf

full stack python : http://www.fullstackpython.com/

the elements of python style : https://github.com/amontalenti/elements-of-python-style#follow-most-pep8-guidelines

how to develop quality python code : https://districtdatalabs.silvrback.com/how-to-develop-quality-python-code

a good book : https://pymotw.com/2/contents.html

another good book : https://pymotw.com/3/

awesome python : https://github.com/vinta/awesome-python

awesome-python.com  : http://awesome-python.com/

easy python : http://easy-python.readthedocs.io/en/latest/

a web book : http://anandology.com/python-practice-book/index.html

udacity python basic : https://cn.udacity.com/course/programming-foundations-with-python--ud036

an amazing python challenge website : http://www.pythonchallenge.com/


Python的开发环境从官网上下载二进制文件进行安装,即得到python解释器、编译器、内置对象和扩展模块的集合。并且自带了IDLE和python manual document。集成开发环境选用PyCharm,界面非常类似于google的AS,练习的时候使用idle。

python是一种面向对象的超高级语言,解释执行,动态语言,是我第一门接触的动态语言。支持任意大小的整数、复数、浮点数、双引号或单引号括起来的字符串、转义字符、布尔值bool、与and或or非not、空None、列表、字典、元组、集合、函数、自定义数据结构。共30个关键字,多种运算符。支持变量赋值,所有数据都是对象,支持常量。最开始很特殊的python不以{}来规定界限和模块而是缩进,标准是一个模块中缩进4个空格。函数采用传递对象引用的方式,既不用值传递也不用引用传递的方式。在python中一切都是对象,之前还看到过有人抨击java不是彻底的面向对象因为java的数据不是对象,觉得很扯淡,可是python里面任何数据都是对象,这真是彻底的面向对象。

在最新的python3版本中字符串采用Unicode编码,python文件开头声明的_*_coding:xxx_*_告诉python解释器怎么去解码表示源代码的字符。只有声明和计算机编码的方式一致的时候,才不会出错。Unicode编码方式中包括utf-8、utf-16和utf-32种类,utf-8采用变长方式1~4个字节表示一个字符,以达到缩小存储空间的目的。对字符串使用encode(type)和decode(type)函数可以将字符串用指定的编码字符集进行编码输出和解码输出,使用len()方法输出字符个数。会由字符和字节编码转换,两者采用相同的字符集才不会出现乱码,第一python源文件使用_*_coding:utf-8_*_声明使得计算机执行的使用utf-8,第二编辑器采用utf-8存储。格式化输出的时候使用%,有%s、%d、%f、%x。


Python支持列表,列表类型list是一种有序的集合,随时添加和删除元素。使用方式类似于数组,但是可以放置不同类型的数据在同一个list中,使用[ ]进行特定位置的元素索引,从0开始,使用-1直接索引最后一个。


python支持元组,元组tuple不能改变,可以索引。但是tuple里面嵌套了list则list是可以改变内容的。tuple的每个元素,指向永远不变,可是指向的内容实际上可以变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象。


简单判断if else elif。input函数返回的是str字符串类型的数据。

Python的循环有两种,一种是for...in循环,依次把list或tuple中的每个元素迭代出来。for x in ...循环就是把每个元素代入变量x,然后执行缩进块的语句。range(x)可以生成0~x-1的list。第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。存在break和continue使用。
dict字典,采用KV存储,即哈希存储,采取覆盖原则。涉及in查询关键字是否在字典中、get函数得到K对应的V、删除函数pop(key)。和list比较,dict有以下几个特点:查找和插入的速度极快,不会随着key的增加而变慢;需要占用大量的内存,内存浪费多。而list相反:查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。dict高速查找。dict的key必须是不可变对象。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。
集合set中存储key,不能重复。要创建一个set,需要提供一个list作为输入集合s = set([1, 2, 3]),数据无序,重复数据自动过滤。涉及add函数、remove函数、交操作&、并操作|。对不可变对象的操作是在创建新的对象返回。


在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。如果想定义一个什么事也不做的空函数,可以用pass语句。可以添加数据类型检查函数isinstance()来检查传参类型。

一个函数可以返回多个值,返回时使用return nx, ny,调用函数接受时使用x, y = move(100, 100, 60, math.pi / 6),实际上返回的是tuple,使用也给变量接受也可以,只不过该变量意为元组。


除了正常定义的必选参数外,还可以使用默认参数x=9、可变参数和关键字参数。默认参数中必选参数在前,默认参数在后,否则Python的解释器会报错。默认参数必须指向不变对象。可变参数就是传入的参数个数是可变的,其形参形式为*numbers,函数内部接受的numbers是一个tuple。可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。调用者仍可以传入不受限制的关键字参数,函数内部可以进行参数检查。如果要限制关键字参数的名字,就可以用命名关键字参数,*后面的参数被视为命名关键字参数。参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。关键字参数可以扩展函数的功能。


Python提供了其他语言没有提供的高级功能,例如slice切片。slice用于指定搜索范围的查找,切片用于list、tuple、dict数据结构。L[0:2]说明从0开始到2为止且不包括位置2,以供2个元素取出,L[-2:-1]从倒数第二位置至最后一个索引位置不包括最后一个数据一个1个即倒数第二个。


python利用for ...in...进行迭代循环,迭代对象可以是list、tuple、dict、str。python极其灵活强大,对dict迭代默认迭代key,使用for value in d.values()迭代值,使用for k, v in d.items(),使用isinstance('abc', Iterable)检查是否可以迭代。


python另一强大的功能在于列表生成式:[x-x*x for x in range(1,19)],而其内部可以进行多层的循环。这些语法叫做语法糖,语法糖是很方便开发者的,但是也因为语法糖的存在其效率会有损失。



Python支持函数式编程。仔细查了查函数式编程的资料。

支持函数式编程的Lisp , python , java8,Scala , Haskell和Clojure 等。函数式编程用在数学计算和并行编程中,原有一个是函数式编程的思想来源于数学适合直截描绘出数学问题,第二个函数式编程中对象的状态禁止修改immutable,这不会出现多线程编程中的为了保护状态而引入的锁、信号量、wait/sleep/notify模式等复杂的概念,不会有线程安全的问题。java8对函数式编程的引入极大增加了java的表达能力,例如Lambda表达式。

OOP中把对象传来传去,函数式编程中把函数传来传去。有些别扭,总是感觉少些什么。

在函数式编程中,函数是基本单位,是第一型,他几乎被用作一切,包括最简单的计算,甚至连变量都被计算所取代。在函数式编程中,变量只是一个名称,而不是一个存储单元,这是函数式编程与传统的命令式编程最典型的不同之处。函数式编程起源于数学。面向对象中,对象是一切,类是抽象的代言,抽象的优势在于简单性和重用性。在函数式编程中函数是抽象的代表,函数式编程的抽象本质则是将函数也作为一个抽象单位,而反映成代码形式,则是高阶函数。高阶函数可以接受一个或多个函数作为参数或者返回一个函数。OOP中对象的属性即对象的特点,是现实对象的属性,而函数式编程是无状态的,所以状态保存在函数的参数中进行传递。

递归对于函数式编程却是不可或缺的。循环是在描述我们该如何地去解决问题,递归是在描述这个问题的定义。递归分成“树形递归”和“尾递归”,什么是树形递归,就是把计算过程逐一展开,最后形成的是一棵树状的结构。尾递归就是不要保持当前递归函数的状态,而把需要保持的东西全部用参数给传到下一个函数里,这样就可以自动清空本次调用的栈空间。尾递归解决了函数中不能定义变量并且不能赋值操作的问题。

函数式编程没有了副作用。纯逻辑的嵌套运行。函数式编程式声明式的,对于申明式的编程范式,你不在需要提供明确的指令操作,所有的细节指令将会更好的被程序库所封装,你要做的只是提出你要的要求,申明你的用意即可。即不用写明怎么做而是说明做什么。

命令式语言的程序员:
  要计算a和b的gcd,先检查a和b是否相等,如果相等就打印他们之中一个并且结束;否则就把较大的那个换成他们的差,并重复这以工作。
函数式语言的程序员:
  当a和b相等时,它们的gcd就定义为a;当a和b不相等时去计算c和d的gcd,其中c是两个数较小的一个,d是两个数的差。要计算给定一对数的gcd,请展开并简化上述定义直到它结束

简单例子:

function(x,bar){
   return bar(x);      
}

function(times,func){
   if(times<=0) return func();
   return function(){
      if(--times<1){return func.apply(this,arguments)};
   }  
}


函数式编程一大好处是代码简介,容易理解,接近人的语言方式。但是缺点会造成由于函数作为参数导致的函数套函数,最后成了一个特大函数,而FP的无状态导致I/O保持最低状态即最少I/O时间,但是函数嵌套执行的时间多了,效率高低众说纷纭啊。

FP易于形成封装控制结构的内置模板函数 ,例如Python中的filter过滤器函数。FP含有了惰性求值的特点,仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

FP使用OO的思维考虑根本行不通啊。需要从how to do 改变为what to do。what to do提出来后总得有地方或有人实现具体的细节,也就是说总是需要有how to do的部分来支持。把众多的how to do 提取出来变成了what to do。

学习一种函数式编程语言最显而易见的好处是,你能学会这种类型语言中的函数式概念。它能帮助你的大脑,让它具有能非常清晰的思考和处理一些惊人的重大概念的能力。这并不是函数式编程具有魔法;各种语言和范式的出现都是为了应对某一特定类别的问题。函数式编程的杀手锏正是应对了当今世界上日益增长的并行性编程和元数据编程趋势。FP是一种紧凑的编程风格,是一种编程范式,一种构建计算机结构和元素的风格,它将计算看作是对数学函数的求值,并避免改变状态以及可变数据。可组合性是FP程序的基本能力之一。

FP中的高阶函数概念类似于OOP中的模板方法。

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。闭包把函数和运行时的引用环境打包成为一个新的整体,所以就解决了函数编程中的嵌套所引发的问题。闭包典型例子:

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

外部函数在内部创建了新的函数,而内部函数sum可以引用外部函数lazy_sum中的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中。调用lazy_sum()时s=lazy_sum(1,2,3)返回的是函数而非结果,只有在调用s()时才会真正执行。内部的返回函数不要引用任何循环变量,或者后续会发生变化的变量。


python支持Lambda表达式即匿名函数,以此简化代码。形式lambda x : ....,x是函数参数,冒号之后是对参数的操作,用于简单的函数操作简化。java8也对lambda表达式进行了支持加入特性之中。
每个函数都有自己的地址,有自己的名字使用function.__name__得到。
通过装饰器可以增强函数的功能。decorator模式。decorator是一个接受一个函数并返回函数的高阶函数,借助Python的@语法,把decorator置于被修饰函数的定义上一行。原函数正常执行调用,不过执行的真正是调用decorator函数并把被修饰函数作为参数传进去。其实在decorator内部会有内置函数decorator返回的也是该函数,该函数内部有执行被修饰函数的语句func(......)才行。
python中的函数是按照调用和返回顺序执行的。python中的很多语法是帮助创建函数的,而之所以帮助是为了提取共有部分从而简化编写。

偏函数Python支持:functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。int2 =functools.partial(int, base=2)就把int()函数的base参数固定为2,而不需要自己再创建新的int2函数体。


python中一个.py文件称作一个模块module,包括python内置模块、自己写的模块和第三方模块。提高了代码的可维护性,还可以避免函数名和变量名冲突。而组织模块的方法使用包package,避免模块名冲突。而package也可以有层次。模块可以进行引用import。
模块实例:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-   编码格式
' a test module '    第一个字符串默认是模块的文档注释
__author__ = 'Michael Liao'
import sys    导入sys模块,拥有sys变量指向该模块,使用sys变量可以获得该模块所有的函数
def test():
    args = sys.argv
    if len(args)==1:
            print('Hello, world!')
    elif len(args)==2:
        print('Hello, %s!' % args[1])
    else:
        print('Too many arguments!')
函数和变量是有自己的作用域的,正常的都是公开的。类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途。类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用。外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
第三方模块安装只需要使用命令pip install module_name即可。安装之后就可以导入并使用了。
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中。可以append自己添加。


参考文章:

http://www.defmacro.org/ramblings/fp.html

递归思想讲解:http://www.ibm.com/developerworks/cn/java/j-lo-funinscala1/

https://mitpress.mit.edu/sicp/

http://www.cnblogs.com/huxi/archive/2011/06/18/2084316.html

FP常用的技巧:http://www.cnblogs.com/lurongkai/p/functional-programming-skills.html

闭包:http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html


0 0
原创粉丝点击