python基礎知識整理


python基礎知識整理(点滴蓄積)
最近やっていることは、主にいくつかのオンライン上の書籍処理フィルタリング、書籍推薦などのタイミング機能であり、hive、MRなどのデータ処理が必要であるため、軽量級のpythonスクリプトが不二選択となり、初心者から入門し、この文は知識の蓄積として、自分が後で調べるために、皆さんの指摘を歓迎します.
1.簡単なチュートリアル
ネット上でpythonに関する簡明なチュートリアルは非常に多く、例えば簡明なPythonチュートリアルです.私はこの文章を通じてpythonの解釈性、弱い意味の特性をざっと理解し、元祖、辞書、リストなど、よく使われるデータ構造も知っています.この段階は簡単な理解にすぎず、無理にプログラムを書くことができます.例えば、最近書いたユーザーの書籍フィルタリングの小さなプログラムは以下の通りです.構造が混乱し、複雑で、向上しなければなりません.モジュール化は不要で、適切なデータ構造は不要で、機能を実現しただけです.
      
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import re
import copy
import Levenshtein

origin_rela_dict ={} #         {"bookID":[bookID...]}
user_origin_rank ={} #     rank{userID:{rank:[bookID....]}}
user_origin ={}      #            {userID:[bookID...]}
book_arpu ={}        #  arpu 
publish_category={}  #                

douban_rela={}   #      
composed_rela={} #      
author_rela={}   #       
category_rela={} #         
hot=[]      #    
pHot=[]          #    20 
boyHot=[]        #    20 
girlHot=[]       #    20 
boyBook={}       #      
girlBook={}      #      
pubBook={}       #      
boutique_books={} #    
def generateOrigin(origin_fee_rank,origin_rela,arpu_file,originHot):
    fd=open(originHot)
    for line in fd:
        data=line.strip().split('\t')
        bookID,type = data[0],data[1]
        #print bookID,type
        if type == '  ':
            if len(boyHot) <=20:
                boyHot.append(bookID)
        elif  type == '  ':
            if len(girlHot) <=20:
                girlHot.append(bookID)
    fd.close()
    # print len(boyHot)
 
    #print len(girlHot) 
    #          
    fd1 =open(origin_rela)
    for line in fd1:
        data1 =line.strip().split("\t")
        if len(data1)!=3:continue
        bookID,origin_rela=data1[1],data1[2].split(",")
        if bookID not in origin_rela_dict:
            origin_rela_dict.setdefault(bookID,origin_rela)
    fd1.close()
    #print origin_rela_dict  
    #        
    fd =open(origin_fee_rank)
    #print "chubandsdsd:%d"% len(allpublish)
    for line in fd:
        rank_tmp={}
        user_origin_tmp={}
        data=line.strip().split("\t")
        if len(data)!=3:continue
        userID,compose,type=data[0],data[1],data[2]
        tmpDict={}
        tmpHot=[]
        if type=='  ':
            tmpDict =boyBook
            tmpHot =boyHot
        if type=='  ':
            tmpDict =girlBook
            tmpHot=girlHot
        if type=='  ':
            tmpHot=boyHot
        book_ranks=compose.strip().split(",")
        for book_rank in book_ranks:
            book,rank = book_rank.strip().split(":")  
            rank_tmp.setdefault(book,rank)
        for id in rank_tmp:
            if id in origin_rela_dict:
                count=0
                feeRank=int(rank_tmp[id])
                origin_rela=origin_rela_dict[id]
                for bid in origin_rela:
                    if bid not in rank_tmp:
                        count=count+1
                        rank=count*int(feeRank)
                        user_origin_tmp.setdefault(rank,[])
                        user_origin_tmp[rank].append(bid)

        iter =sorted(user_origin_tmp.items(),lambda x,y:cmp(x[0],y[0]))
        booknum=0
        info="%s\t"%userID
        flag=False
        book_result=[]
        for ranks in iter:
            arpu_tmp={}
            uids=ranks[1] #  ID  
            for id in uids:
                if id in book_arpu  and id not in boutique_books:
                    arpu_tmp.setdefault(id,book_arpu[id])
            iter1 =sorted(arpu_tmp.items(),lambda x,y:cmp(y[1],x[1]))
            for it in iter1 :
                if it[0] in book_result:continue
                book_result.append(it[0])
                booknum=booknum+1
                if booknum==20:
                    flag =True
                    break 
            if flag:
                break
        #     type      type   
        if type =='  ':
            if len(book_result)<20:
                book_result.extend(tmpHot[:20])
                print userID+'\t'+','.join(book_result[:20])
            else:
                print userID+'\t'+','.join(book_result[:20])
        else:
            final_book=[]
            for bid in book_result:
                if bid in tmpDict:
                    final_book.append(bid)
            if len(final_book)<20:
                final_book.extend(tmpHot[:20])
                print userID+'\t'+','.join(final_book[:20])
            else:
                print userID+'\t'+','.join(final_book[:20])

if __name__ == "__main__":
    type = sys.argv[1]
    if type == "1": #         \t   ID
        origin_fee_rank,origin_rela,arpu_file,originhot,originfile,boutique= sys.argv[2:]
        bookArpuGenerate(arpu_file)
        boutiqueGenerate(boutique)
        publishGenerate(originfile)
        generateOrigin(origin_fee_rank,origin_rela,arpu_file,originhot)
    elif type == "2": #          \t      \t  ID
        arpufile,allfile,doubanfile,composedfile,authorfile,categoryfile,hotfile,publishfile,boutique= sys.argv[2:]
        bookArpuGenerate(arpufile)
        boutiqueGenerate(boutique)
        listIntialise(doubanfile,composedfile,authorfile,categoryfile,hotfile,allfile)
        generatePublish(publishfile)
    else: #      
        tagfile, booktagfile = sys.argv[2:]
        IncreTag2Id(tagfile, booktagfile)

中にはファイル処理の中間関数が列挙されていないものもあり、問題が多く、copyの運用が不合理で、setを使うべきで役に立たないなどがありますが、これも入門の小さなプログラムでしょう.
2.基礎または見落としやすい知識点(更新を継続)
2.1#について!/usr/bin/env python
              
スクリプト言語の最初の行は、このファイルのコードを実行可能なプログラムで実行したいということを指摘することです.簡単です.usr/bin/pythonは、オペレーティングシステムにこのスクリプトを実行するように伝えたときに、/usr/binの下のpython解釈器を呼び出す;#!/usr/bin/env pythonこの使い方は、オペレーティングシステムのユーザーがpythonをデフォルトの/usr/binパスにインストールしないようにするためです.この行が表示されると、まずenv設定でpythonのインストールパスを検索し、対応するパスの下の解釈プログラムを呼び出して操作を完了します.
         #!/usr/bin/pythonはpythonパスを書き殺したことに相当します;#!/usr/bin/env pythonは環境設定に行ってpythonディレクトリを探します.この書き方をお勧めします.
2.2#-*-coding:utf-8-*-について
デフォルトではpythonです.pyファイルは標準的な7ビットのASCIIコードで格納が、場合によってはユーザが必要とする.pyファイルにはunicode文字がたくさん含まれています.例えば.pyファイルに中国語の文字列を含める必要がある場合は.pyファイルの1行目または2行目にencodingコメントを追加します.pyファイルはunicode形式で指定されます.文字コードの知識については、後で行学習と補足を行います.
2.3 if_についてname__ == "__main__":
まず、pythonファイルは.pyで終わりますが、pythonファイルはモジュール(参照用)として実行したり、メインプログラム(直接実行)として実行したりすることができます.通常、モジュールには関数と変数しか含まれず、呼び出されます.モジュールとメイン関数を区別するにはif__name_=="_main_":,_name__モジュールまたはメイン関数をマークするpythonスクリプトの内蔵プロパティです.スクリプトが直接呼び出される場合、python xxが一般的です.pyが実行されるとif__が実行されますname__ == "__main__":後のプログラム;import xxを使用する場合.pyモジュールを導入した場合、メインプログラムは実行されません.(ちょっと回りくどい言い方ですが、実は簡単です)
通常、if_name__ == "__main__":モジュールでテストします.