Python成长录

本文从WordPress迁移而来, 查看全部WordPress迁移文章

2013-11

  • 输入数据:raw_input(),split()函数进行分片;利用map函数,将分片后的每个字符串转化为数字 map(int, ….) , map还有很多用法非常强大

    1
    n , m = map(int , raw_input().split()) #等价于  scanf(“%d%d”,&n,&m);
  • 给一个数组输入信息

    1
    2
    sample input
    1 2 3 4 5

    在c中,创建了一个a数组,然后依次输入

    1
    for(int i = 0; i < n; i++) scanf("%d",&a[i]);

    在python中可以创建数组和输入同时完成

    1
    a = map(int , raw_input().split())

    可见split将字符串分片后给到map处理成整数并且是以一个列表的形式返回并将这个列表赋值给了a变量

  • raw_input()是读入一行字符串,以回车结束,不以空格结束,这导致了在输入上不想c那么随意

    例如上面的例子,给a数组输入 1 2 3 4 5,就算输入

    1
    2
    3
    1 2
    3
    4 5

    c语言一样能给到a数组

    但是在python中一定写在一行 1 2 3 4 5,否则会出错

    1
    2
    n , m = map(int , raw_input().split())
    a = map(int , raw_input().split())
  • 打印一行数字:1 2 3 4

    python的print是自动换行的,若想后面是空格,加上一个,

    1
    print x ,

    或者使用sys.stdout.write();注意sys.stdout.write()只能打印字符串

    另外就是用print实现类似于c语言的格式化输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import sys

    a = "abcd"
    b = "efg"
    c = "hijk"
    e = int(15)

    print a
    print b
    print c
    # abcd
    # efg
    # hijk

    print a,
    print b,
    print c
    # abc efg hijk

    sys.stdout.write(a)
    sys.stdout.write(b)
    sys.stdout.write(c)
    sys.stdout.write('\n')
    # abcdefghijk
    # ERROR : sys.stdout.write(e)

    sys.stdout.write(a + " ")
    sys.stdout.write(b + " ")
    sys.stdout.write(c + " ")
    sys.stdout.write('\n')
    # abcd efg hijk

    print "%d %s" % (e,a)
    # 15 abcd
  • 在python中实现c语言的一些常用函数(不断补充)

    swap(a,b) <==> a,b = b,a

    max(a,b) <==> max(a,b)

    min(a,b) <==> min(a,b)

    1
    2
    3
    4
    5
    6
    7
    8
    # swap(a,b)
    a , b = b , a

    # max(a,b)
    c = max(a,b)

    # min(a,b)
    c = min(a,b)
  • 开辟数组

    开辟一个1维数组,长度为10,将数组初始化为0:a = [0] * 10

    开辟一个1维数组,长度为10,将数组初始化为一段连续的值,例如1到10:a = range(1,11)

    开辟一个1维数组,长度为10,循环赋值,从1到5,例如1 2 3 4 5 1 2 3 4 5:a = [1,2,3,4,5] * 2

    开辟一个2维数组,a[5][10],初始化为0:a = [ [0]*10 for _ in range(5) ]

    开辟一个3维数组,a[2][5][10],初始化为0:a = [ [ [0]*10 for _ in range(5) ] for _ in range(2)]

    从开辟多维数组的角度来看,python的思想其实是“嵌套的列表”,例如二维列表a,a算是1维列表,但是该列表有点特殊,它里面的每个元素,都是一个列表,并且长度相同,如果要索引到里面的列表的某个元素,则好像c语言一样,a[x][y]即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    a = [0] * 10
    print a[0]
    # 0

    a = range(1,11)
    print a[0]
    # 1

    a = [1,2,3,4,5] * 2
    print a[0] , a[5]
    # 1 1

    a = [ [0]*10 for _ in range(5) ]
    print a[0][0]
    # 0
    print a[0]
    # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    a = [ [ [0]*10 for _ in range(5) ] for _ in range(2)]
    print a[0][0][0]
    # 0
    print a[0][0]
    # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    print a[0]
    # [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

    # 注意有些是打印了当个元素,有些打印了一系列的元素,但他们不是无关系的元素,而是一个列表
    # 所以有一个[ ]将他们扩起来;有的甚至打印了嵌套的列表,这充分说明了python中
    # 嵌套列表的思想

2013-12

  • 自学python要学会使用dir和help,dir用于查看一个模块,help用于查看该模块下每个函数,变量等

    例如我们要用python自带的GUI工具包Tkinter开发程序,可以import Tkinter,然后dir(Tkinter),这样就列出了Tkinter的所有函数,我们可以选择其中的Label,看看它的内容,help(Tkinter.Label)。这可以称为python的一种自省机制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    >>> import Tkinter
    >>> dir(Tkinter)
    ['ACTIVE', 'ALL', 'ANCHOR', 'ARC', 'At', 'AtEnd', 'AtInsert', 'AtSelFirst', 'AtSelLast', 'BASELINE', 'BEVEL', 'BOTH', 'BOTTOM', 'BROWSE', 'BUTT', 'BaseWidget', 'BitmapImage', 'BooleanType', 'BooleanVar', 'BufferType', 'BuiltinFunctionType', 'BuiltinMethodType', 'Button', 'CASCADE', 'CENTER', 'CHAR', 'CHECKBUTTON', 'CHORD', 'COMMAND', 'CURRENT', 'CallWrapper', 'Canvas', 'Checkbutton', 'ClassType', 'CodeType', 'ComplexType', 'DISABLED', 'DOTBOX', 'DictProxyType', 'DictType', 'DictionaryType', 'DoubleVar', 'E', 'END', 'EW', 'EXCEPTION', 'EXTENDED', 'EllipsisType', 'Entry', 'Event', 'FALSE', 'FIRST', 'FLAT', 'FileType', 'FixTk', 'FloatType', 'Frame', 'FrameType', 'FunctionType', 'GROOVE', 'GeneratorType', 'GetSetDescriptorType', 'Grid', 'HIDDEN', 'HORIZONTAL', 'INSERT', 'INSIDE', 'Image', 'InstanceType', 'IntType', 'IntVar', 'LAST', 'LEFT', 'Label', 'LabelFrame', 'LambdaType', 'ListType', 'Listbox', 'LongType', 'MITER', 'MOVETO', 'MULTIPLE', 'MemberDescriptorType', 'Menu', 'Menubutton', 'Message', 'MethodType', 'Misc', 'ModuleType', 'N', 'NE', 'NO', 'NONE', 'NORMAL', 'NS', 'NSEW', 'NUMERIC', 'NW', 'NoDefaultRoot', 'NoneType', 'NotImplementedType', 'OFF', 'ON', 'OUTSIDE', 'ObjectType', 'OptionMenu', 'PAGES', 'PIESLICE', 'PROJECTING', 'Pack', 'PanedWindow', 'PhotoImage', 'Place', 'RADIOBUTTON', 'RAISED', 'READABLE', 'RIDGE', 'RIGHT', 'ROUND', 'Radiobutton', 'S', 'SCROLL', 'SE', 'SEL', 'SEL_FIRST', 'SEL_LAST', 'SEPARATOR', 'SINGLE', 'SOLID', 'SUNKEN', 'SW', 'Scale', 'Scrollbar', 'SliceType', 'Spinbox', 'StringType', 'StringTypes', 'StringVar', 'Studbutton', 'TOP', 'TRUE', 'Tcl', 'TclError', 'TclVersion', 'Text', 'Tk', 'TkVersion', 'Toplevel', 'TracebackType', 'Tributton', 'TupleType', 'TypeType', 'UNDERLINE', 'UNITS', 'UnboundMethodType', 'UnicodeType', 'VERTICAL', 'Variable', 'W', 'WORD', 'WRITABLE', 'Widget', 'Wm', 'X', 'XRangeType', 'XView', 'Y', 'YES', 'YView', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_cnfmerge', '_default_root', '_exit', '_flatten', '_join', '_magic_re', '_setit', '_space_re', '_stringify', '_support_default_root', '_test', '_tkerror', '_tkinter', '_varnum', 'getboolean', 'getdouble', 'getint', 'image_names', 'image_types', 'mainloop', 're', 'sys', 'tkinter', 'wantobjects']
    >>> help(Tkinter.Label)
    Help on class Label in module Tkinter:

    class Label(Widget)
    | Label widget which can display text and bitmaps.
    |
    | Method resolution order:
    | Label
    | Widget
    | BaseWidget
    | Misc
    | Pack
    | Place
    | Grid
    |
    | Methods defined here:
    |
    | __init__(self, master=None, cnf={}, **kw)
    | Construct a label widget with the parent MASTER.
    |
    | STANDARD OPTIONS
    |
    | activebackground, activeforeground, anchor,
    | background, bitmap, borderwidth, cursor,
    | disabledforeground, font, foreground,
    | highlightbackground, highlightcolor,
    | highlightthickness, image, justify,
    | padx, pady, relief, takefocus, text,
    | textvariable, underline, wraplength
    |
    ..........................................
  • 【转】python的“main函数”:http://blog.csdn.net/noodies/article/details/6034105

    在C/C++/Java中,main是程序执行的起点,Python中,也有类似的运行机制,但方式却截然不同:Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数。

    每个文件(模块)都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分主执行文件还是被调用的文件,Python引入了一个变量name,当文件是被调用时,name的值为模块名,当文件被执行时,name为’main‘。这个特性,为测试驱动开发提供了极好的支持,我们可以在每个模块中写上测试代码,这些测试代码仅当模块被Python直接执行时才会运行,代码和测试完美的结合在一起。

    • hello.py

      1
      2
      3
      4
      5
      6
      def foo():
      str="function"
      print(str);
      if __name__=="__main__":
      print("main")
      foo()
其中if __name__=="__main__":这个程序块类似与Java和C语言的中main(主)函数    

在Cmd中运行结果

1
2
3
C:\work\python\divepy>python hello.py
main
function
在Python Shell中运行结果
1
2
3
4
5
6
>>> import hello
>>> hello.foo()
function
>>> hello.__name__
'hello'
>>>
可以发现这个内置属性__name__自动的发生了变化。 这是由于当你以单个文件运行时,__name__便是__main__;当你以模块导入使用时,这个属性便是这个模块的名字。

2014-2

居然又过去两个月了…..

今天写了一个CF的题目,没用到什么新东西,倒是很久没看没写python,很多忘记了,复习点东西

  • 对于一个数字数组,经常需要求其求和,有时候是整个数组有时候是数组中某个连续的段,在python中,不要用循环去写,会显得很幼稚,哈哈,直接利用sum()内置函数即可

    1
    2
    3
    4
    5
    #sum()的参数是一个列表,如果已有一个数字列表,要对数字列表的某一段求和,直接sum(num[a:b])
    #而不必写循环,复习num[a:b]的范围是[a,b-1]
    num = map(int,raw_input().split())
    SUM = sum(num[0:4])
    print SUM
  • 对于一个数组(任意类型),我们经常要拿到它的其中连续的一段出来,做别的处理,那么我们就要copy那一段,在python中,利用copy函数,直接赋值,是不同的

    1
    2
    3
    4
    5
    6
    7
    from copy import copy
    #当num里面的值改变的时候,num1不变,num2跟着改变
    num = [1,2,3]
    num1 = copy(num)
    num2 = num
    #只复制某个连续的段
    num3 = copy(num[1,4])
  • 常用的排序到倒转,对一个列表排序和倒转,可以用列表内的函数,也可以用python的内置函数

    1
    2
    3
    4
    5
    6
    num = [1,2,3]
    num.sort()
    num.reverse()
    #内置函数 sorted() , reversed()
    sorted(num)
    reversed(num)