zoukankan      html  css  js  c++  java
  • 很多Python新手教程

    重要提示
    这不是一个教程新手程序员准备,你担任很快编程,或者没有使用1至2程序设计语言,请移步!这是一些编程经验准备.它最出名Java或C,理解命令行,Shell等待.简而言之,面向老鸟的,让老鸟高速上手Python教程.
    为什么总结这种一个教程
    我虽不是老鸟,但已熟悉Java,C/C++, Shell和Perl,且对常见的数据结构和算法等都了解.近期因项目须要,要做一个小工具,评估后感觉用Python实现最为方便,于是就有了对Python的学习.这时就须要一门高速上手Python的教程:由于编程语言的基本知识,以及怎样实现程序对我来说不是难事,关键的就是怎样详细使用Python语句来体现程序的逻辑!Python的书籍对我来说内容太多了,没有时间去看,查找也不是非常easy!网上的资料又太零散,这就须要一个高速入门Python的教程.

    这里重点是以对照的方式来说明Python与其语言的不同之处,和一些Python特有的特性,以能以最高速度能用Python敲代码.


    Python是一门动态语言

    与Java,C等相对,Python不用编译,像脚本一样直接执行.这就导致了,全部错误都是执行时的!即使有语法错误,或者异常,假设程序逻辑没有执行到,就不会有错误.比方一个if分支中有语法错误,使用了没有定义的函数,但假设未执行到此分支,就能够正常执行.
    动态的另外一层意思就是它的类型是动态的,也就是说无需指定变量的类型,在执行时,依据它的内容来决定的类型.

    怎样执行Python

    通常来讲有二种方式,一种方式是交互式的,就像Shell命令行提示符那样,交互式的,输入,就有输出;
    在终端输入python命令,就进入了Python的命令提示符中:>>>输入Python语句,解释器就会运行,并输出结果,如:
    [alex@alexon:~]$python
    Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> print 'hello, world'
    hello, world
    >>>
    
    输入exit()能够退出命令提示符.
    第二种方式就是脚本,就像Shell的脚本的一样,把一组命令集合到一起运行,这就能发挥更大的作用.
    #!/usr/bin/python
    print 'hello, world'
    

    Python以缩进来区分语句块

    不像Java,C/C++以花括号{}来区分语句块.Python是以缩进来表示语句块,同一缩进级别为同一级别的语句块.
    一个脚本文件里的0级缩进是文件载入的时候就会被运行的语句,如上面的print.开启一个新的缩进须要使用:(冒号),代表下一级别的语句块,如条件,循环或者函数定义.
    缩进最好使用四个空格.并且要注意缩进要一致,使用空格就全都用空格,使用Tab就都使用Tab,混用就可能得到缩进错误:
    IndentationError: unindent does not match any outer indentation level

    操作符

    与Java和C中十分类似, +(加), -(减), *(乘), /(除), %(求余), **(指数运算), = (赋值).以及减便运算,如 +=, -=, *=和/= 等.
    赋值运算与其它语言一致.
    逻辑操作
    > < <= >= != ==与其它语言一样.
    不一样的有not逻辑非,and逻辑与和or逻辑或.

    凝视与文档

    一行其中,从#開始地方就是凝视.不会影响下一行.
    ""引號放在文件的开头,函数的开头或者一个类的开头,就是文档凝视,与Java中的/** ... */作用和目的是一样的.

    折行

    假设一行太长了,写不下了,就须要在下一行接着写,这时能够使用来告诉Python,下一行继续.

    一行写多个语句

    Python是一个语句放在一行,行尾能够选择性的加上;但假设想在一行放多个语句,就须要用;来分隔语句:
    a = 1; b = 2; c = 3;
    尽管这在语法上可行,但不是一个好习惯,绝大多数的编程规范都是要一行写一个语句.

    基本数据类型

    • int 
    • long
    • bool
    • float
    与Java中很接近.能够近似觉得一致.bool的值是True和False,或者0(False),非0就是True.

    List和Tuple

    这就是Java或C中的数组.它是一个容器,能用来顺序的,以整数索引方式检索, 存储一组对象.List用[]来表示,如[1, 2, 3]就是一个List;而Tuple用()来表示,如(3, 4, 5)就是一个Tuple.它们的差别在于List是可变的;而Tuple是不可变的.也就是说不能够增,删和改.
    索引方式除了与Java一样的以一个整数下标方式外,还能够指定開始,结束和步长,和使用负索引来切割List:
    通用语法格式是:list[start:end:step]
    • list[index] --- 返回第(index+1)个元素,受C语言影响,下标亦是从0開始
    • list[start:end] --- 返回从start開始,到end-1,也就是list[start], list[start+1].....list[end-1]
    • list[start:end:step] --- 与上面类似,仅仅只是每隔step取一个
    • list[:end]  ---- 缺省的开端是0
    • list[start:] ---- 缺省的结尾是len(list),或者-1
    负数索引更是方便,它与正数的相应关系为:
    正数索引   0    1      2      3
    数组元素  [1]   [3]    [5]    [7]
    负数索引  -4    -3      -2    -1
    实例:
    >>> a = [1, 3, 5, 7];
    >>> a[0]
    1
    >>> a[3]
    7
    >>> a[-1]
    7
    >>> a[-2]
    5
    >>> a[0:3]
    [1, 3, 5]
    >>> a[1:3:2]
    [3]
    >>> a[0:3:2]
    [1, 5]
    >>> a[0:-1:2]
    [1, 5]
    >>>
    
    List是一个对象,它有一此内置的方法,如:
    • 包括关系: in, not in
    >>> 3 in a
    True
    >>> 8 in a
    False
    >>> 8 not in a
    True
    >>>
    • 连接符: +
    >>> a + [9, 11]
    [1, 3, 5, 7, 9, 11]
    • 反复: *
    >>> a * 2
    [1, 3, 5, 7, 1, 3, 5, 7]
    >>>

    字符串String

    字符串就是一个字符的数组,List的操作都能够对String直接使用.
    >>> str = 'hello, world'
    >>> str[0:3]
    'hel'
    >>> str[0:3:2]
    'hl'
    >>> str[-1]
    'd'
    >>> str * 2
    'hello, worldhello, world'
    >>> '3' in str
    False
    >>> 'le' in str
    False
    >>> 'el' in str
    True
    >>> 'ell' not in str
    False
    >>>
    

    字串格式化符%

    这是一个类似C语言printf和Java中的String.format()的操作符,它能格式化字串,整数,浮点等类型:语句是:
    formats % (var1, var2,....)
    它返回的是一个String.
    >>> "Int %d, Float %d, String '%s'" % (5, 2.3, 'hello')
    "Int 5, Float 2, String 'hello'"
    >>>
    

    Dictionary字典

    相当于Java中的HashMap,用于以Key/Value方式存储的容器.创建方式为{key1: value1, key2: value2, ....}, 更改方式为dict[key] = new_value;索引方式为dict[key]. dict.keys()方法以List形式返回容器中全部的Key;dict.values()以List方式返回容器中的全部的Value:
    >>> box = {'fruits': ['apple','orange'], 'money': 1993, 'name': 'obama'}
    >>> box['fruits']
    ['apple', 'orange']
    >>> box['money']
    1993
    >>> box['money'] = 29393
    >>> box['money']
    29393
    >>> box['nation'] = 'USA'
    >>> box
    {'money': 29393, 'nation': 'USA', 'name': 'obama', 'fruits': ['apple', 'orange']}
    >>> box.keys()
    ['money', 'nation', 'name', 'fruits']
    >>> box.values()
    [29393, 'USA', 'obama', ['apple', 'orange']]
    >>>
    

    分支语句

    格式为:
    if expression:
          blocks;
    elif expression2:
          blocks;
    else:
          blocks;
    当中逻辑表达式能够加上括号(),也能够不加.但假设表达式里面比較混乱,还是要加上括号,以提高清晰.但总体的逻辑表达式是能够不加的:
    >>> a = 3; b = 4; c = 5;
    >>> if a == b and a != c:
    ... print "Are you sure"
    ... elif (a == c and b == c):
    ... print "All equal"
    ... else:
    ... print "I am not sure"
    ... 
    I am not sure
    >>>
    

    while循环

    与Java中类似:
    while expression:
          blocks
    >>> i = 0; 
    >>> while i < 3:
    ... print "I am repeating";
    ... i += 1;
    ... 
    I am repeating
    I am repeating
    I am repeating
    >>>
    

    for语句

    与Java中的foreach语法一样, 遍历List:
    for var in list:
         blocks;
    >>> msg = "Hello";
    >>> for c in msg:
    ... print c;
    ... 
    H
    e
    l
    l
    o
    >>>
    

    数组推导

    这是Python最强大,也是最性感的功能:
    list = [expression for var in list condition]
    它相当于这种逻辑:
    list = [];
    for var in list:
        if condition:
             execute expression;
             add result of expression to list
    return list;
    一句话,相当于这么多逻辑,可见数组推导是一个十分强大的功能:
    >>> a = range(4);
    >>> a
    [0, 1, 2, 3]
    >>> [x*x for x in a if x % 2 == 0]
    [0, 4]
    >>>
    
    遍历列表a,对其是偶数的项,乘方.

    函数

    怎样定义函数
    def function_name(args):
          function_body;
    调用函数的方式function_name(formal_args):
    >>> def power(x):
    ... return x*x;
    ... 
    >>> power(4)
    16
    >>>
    
    Python中函数也是一个对象,能够赋值,能够拷贝,能够像普通变量那样使用.事实上能够理解为C语言中的指针:
    >>> d = power;
    >>> d(2)
    4
    
    
    另外就是匿名函数,或者叫做lambda函数,它没有名字,仅仅有參数和表达式:
    lambda  args: expression
    >>> d = lambda x: x*x;
    >>> d(2)
    4
    
    lambda最大的用处是用作实參:
    >>> def iter(func, list):
    ... ret = [];
    ... for var in list:
    ... ret.append(func(var));
    ... return ret;
    ... 
    >>> iter(lambda x: x*x, a)
    [0, 1, 4, 9]
    >>>
    

    一些经常使用的内置函数

    所谓内置函数,就是不用不论什么导入,语言本身就支持的函数:
    • print --- 打印输出
    print var1, var2, var3
    >>> a
    [0, 1, 2, 3]
    >>> d
    <function <lambda> at 0x7f668c015140>
    >>> print a, d
    [0, 1, 2, 3] <function <lambda> at 0x7f668c015140>
    >>>
    print与%结合更为强大:
    print formats % (var1, var2, ...):
    >>> print "today is %d, welcome %s" % (2013, 'alex');
    today is 2013, welcome alex
    >>>

    事实上这没什么神奇的,前面提到过%格式化返回是一个字串,所以print仅是输出字串而已,格式化工作是由%来做的.

    • len()---返回列表,字串的长度
    • range([start], stop, [step]) --- 生成一个整数列表,从,start開始,到stop结束,以step为步长

    >>> range(4)
    [0, 1, 2, 3]
    >>> range(1,4)
    [1, 2, 3]
    >>> range(1,4,2)
    [1, 3]
    >>>

    • help(func)---获取某个函数的帮助文档.

    运行系统命令行命令

    import subprocess;
    • check_call(commands, shell=True)能够运行一个命令,并检查结果:
    >>> check_call("ls -l .", shell=True);
    total 380
    -rw-r--r-- 1 alex alex 303137 Jun 28 23:25 00005.vcf
    drwxrwxr-x 3 alex alex 4096 Jun 28 23:57 3730996syntheticseismogram
    -rw-rw-r-- 1 alex alex 1127 Jun 28 23:45 contacts.txt
    -rw-rw-r-- 1 alex alex 3349 Jun 29 00:19 contacts_vcard.vcf
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Desktop
    drwxr-xr-x 3 alex alex 4096 Jun 22 08:59 Documents
    drwxr-xr-x 9 alex alex 4096 Jul 3 20:34 Downloads
    -rw-r--r-- 1 alex alex 8445 Jun 15 18:17 examples.desktop
    drwxrwxr-x 5 alex alex 4096 Jun 19 23:01 gitting
    -rw-rw-r-- 1 alex alex 0 Jun 19 20:21 libpeerconnection.log
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Music
    -rw-rw-r-- 1 alex alex 148 Jul 4 22:46 persons.txt
    drwxr-xr-x 3 alex alex 4096 Jul 4 23:08 Pictures
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Public
    -rw-rw-r-- 1 alex alex 65 Jul 8 22:15 py.py
    -rw-rw-r-- 1 alex alex 271 Jul 4 21:28 speech.txt
    -rw-rw-r-- 1 alex alex 93 Jul 3 23:02 speech.txt.bak
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Templates
    drwxrwxr-x 2 alex alex 4096 Jun 22 19:01 Ubuntu One
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Videos
    0
    >>>

    check_call是相当于在Shell上运行一个语句,所以能够发挥想像力,组合Shell命令:

    >>> check_call("ls -l . | grep 'py'", shell=True);
    -rw-rw-r-- 1 alex alex 65 Jul 8 22:15 py.py
    0
    >>>

    所以,这是相当强大的工具,能够像写Shell脚本那样,结合管道干一些大事!
    • check_output(cmds, shell=True)运行命令,并以字串形式返回结果:
    >>> a = check_output("ls -l .", shell=True);
    >>> a
    'total 380
    -rw-r--r-- 1 alex alex 303137 Jun 28 23:25 00005.vcf
    drwxrwxr-x 3 alex alex 4096 Jun 28 23:57 3730996syntheticseismogram
    -rw-rw-r-- 1 alex alex 1127 Jun 28 23:45 contacts.txt
    -rw-rw-r-- 1 alex alex 3349 Jun 29 00:19 contacts_vcard.vcf
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Desktop
    drwxr-xr-x 3 alex alex 4096 Jun 22 08:59 Documents
    drwxr-xr-x 9 alex alex 4096 Jul 3 20:34 Downloads
    -rw-r--r-- 1 alex alex 8445 Jun 15 18:17 examples.desktop
    drwxrwxr-x 5 alex alex 4096 Jun 19 23:01 gitting
    -rw-rw-r-- 1 alex alex 0 Jun 19 20:21 libpeerconnection.log
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Music
    -rw-rw-r-- 1 alex alex 148 Jul 4 22:46 persons.txt
    drwxr-xr-x 3 alex alex 4096 Jul 4 23:08 Pictures
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Public
    -rw-rw-r-- 1 alex alex 65 Jul 8 22:15 py.py
    -rw-rw-r-- 1 alex alex 271 Jul 4 21:28 speech.txt
    -rw-rw-r-- 1 alex alex 93 Jul 3 23:02 speech.txt.bak
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Templates
    drwxrwxr-x 2 alex alex 4096 Jun 22 19:01 Ubuntu One
    drwxr-xr-x 2 alex alex 4096 Jun 15 18:43 Videos
    '
    >>> b = check_output("ls -l . | grep 'py'", shell=True);
    >>> b
    '-rw-rw-r-- 1 alex alex 65 Jul 8 22:15 py.py
    '
    >>>

    不用我说你就知道它的强大之处了!唯一须要注意的就是换行符也在里面,处理的时候须要注意!

    正則表達式

    Python也是支持正則表達式的,至于正則表達式,跟其它的语言如Java,C没什么区别,这里说说怎样使用正則表達式来进行匹配:
    import re;
    p = re.compile(expression);
    m = p.search(target);
    if m != None:
        # got match
    else:
        # no match
    如:
    >>> message = 'Welcome to the year of 2013';
    >>> import re;
    >>> p = re.compile('(d+)');
    >>> m = p.search(message);
    >>> m
    <_sre.SRE_Match object at 0x7f668c015300>
    >>> print m.group(1)
    2013
    >>>

    这些就是Python的入门基础知识, 了解了这些内容,我相信就能够使用Python来完毕你的须要,比方写一些小工具之类的.对于大部分的日常工作,或者一些小工具来说,这些东西就足够了!
    可是假设想学会Python,或者想学好Python,这才是一个小小的开端,最好读一读<Python核心编程>这本书,相当的不错.

    推荐资料:

    • Learn Python the Hard Way这是一个相当好的站点.它的最大长处在于以实例为核心来解说.缺点就是讲的不是非常深入,非常适合入门汉.
    • <Core Python Programming>这本书相当的好,内容具体,且有练习题能够做
    • Coding Bat这上面有非常多Python的练习题,非常多都是关于String和List的,非常适合刚開始学习的人练手
    • Python for fun还有许多小规模的项目,上述.它可以被用于实施.


    假设你有一个很好的资源或信息,推荐一下啊!
  • 相关阅读:
    [DB] 数据库的连接
    JS leetcode 翻转字符串里的单词 题解分析
    JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
    JS leetcode 搜索插入位置 题解分析
    JS leetcode 杨辉三角Ⅱ 题解分析
    JS leetcode 寻找数组的中心索引 题解分析
    JS leetcode 移除元素 题解分析
    JS leetcode 最大连续1的个数 题解分析
    JS leetcode 两数之和 II
    JS leetcode 反转字符串 题解分析
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4563910.html
Copyright © 2011-2022 走看看