美文网首页
python 入门 第0篇: 开篇

python 入门 第0篇: 开篇

作者: apksec | 来源:发表于2018-03-31 18:09 被阅读0次

    0. 前言

    接触python已有2年时间, 感觉自己还是一直处于仅仅使用python能够完成日常工作需要的阶段. 刚开始接触到python也是工作需要的原因, 因为之前有c语言基础, 所以当时也只是仅仅熟悉了一下python语法就开始使用python去做一些开发, 刚开始时完全是按照c的编码风格去使用python:

    #循环
    i = 0
    while i < 5:
        #do something
        i += 1
        
    #判断字符串是否为空
    name = 'abc'
    if 0 == len(name):
        print 'null'
    else:
        print 'not null'
    

    后来随着代码量的增加, 慢慢发现原来python中还有更优雅(pythonic)的方式实现上面代码:

    #循环
    for i in range(5):
        #do something
        
    #判断字符串是否为空
    name = 'abc'
    if not name:
        print 'null'
    else:
        print 'not null'
    

    我觉得学习一门编程语言(以python为例)大概可以分为初、中、高三个阶段:

    • 初级阶段:
      • 掌握python的语法规范, 可以熟练使用各种python库完成工作需要
    • 中级阶段:
      • 阅读优秀python开源库代码, 了解其内部实现细节, 尝试自己做一些开源项目
    • 高级阶段
      • 阅读python源码, 了解其内部实现细节, 为python开源社区做一些贡献

    就我个人而言, 目前还算不上初级阶段, 对python的一些语法规范还不了解, 甚至连python类中的一些魔法方法是做什么的都不知道, 所以这就是我要写python入门系列文章最主要的原因, 我想通过这一系列文章提高自己以下几个方面:

    • 进一步巩固已掌握的python知识, 学习之前没有了解过的其他python知识
    • 锻炼自己的语言表达能力, 养成写博客(做总结笔记)的好习惯

    1. python简介

    关于对python的介绍, 网上一搜一大把, 这就也就不再赘述. 简单的介绍一下吧

    tiobe_201803统计

    上图为TIOBE2018年3月份的编程语言排行榜统计, 可以看到python一直实在呈上升趋势的, 近几年比较火的领域(AI、机器学习、大数据分析)也都有python的身影, 并且我们国家也将把python语言加入到高考科目, 显然python已经成为最受欢迎的程序设计语言之一

    python特点:

    • 语法简单、易学易用
      • 相比于C/C++, python的语法非常简单, 使用丰富的库可以快速完成开发, 无需自身管理内存的使用, python解释器会自动分配、回收内存
    • 跨平台
      • python属于脚本语言, 非编译型语言, 程序执行时由python解释器解释执行, 所以只要python解释器支持跨平台了, 我们编写的代码自然也就支持跨平台了
    • 拥有非常丰富的库
      • python拥有非常丰富的库, 涉及到各个领域, 这也是python能够如此之火最主要的原因之一, 使用python的库可以非常轻松快速的完成开发
    • 很好的扩展性
      • python提供了扩展接口, 通过接口可以实现C与python的相互调用

    python解释器:

    • CPython
      • python官方的解释器, 也是使用最广泛的解释器, 通过python官网下载的就是它
    • IPython
      • IPython在CPyhon基础上增强了交互方式的解释器, 执行python代码时与CPython完全一致
    • PyPy
      • PyPy它的目标是执行速度, 采用JIT技术对python代码进行动态编译(注意不是解释), 所以可以显著提高python代码的执行速度
    • Jython
      • Jython是运行在Java平台上的python解释器, 可以直接把python代码编译成Java字节码执行
    • IronPython
      • IronPython和Jython类似, 只不过IronPython是运行在微软.Net平台上的python解释器, 可以直接把python代码编译成.Net的字节码

    2. python安装

    通常Linux和Mac OS都已内置了python, 只不过有些内置的python可能是比较旧的版本, 只需要升级到新版即可, 所以这里主要是windows的安装

    通过官网下载地址下载, Windows/Linux/Mac OS

    python加入到环境变量

    将安装的python加入到系统环境变量中, 如安装到了C:\Python27, 就在系统环境变量的PATH项增加两个值 C:\Python27;C:\Python27\Scripts;

    python版本

    运行cmd, 属于python -V 会输出当前安装的python版本

    3. python IDE安装

    我们经常说好的代码是调出来的, 说明了代码调试的重要性. 虽然官方python也内置了ide, 但在实际开发项目中我们通常不会使用python内置的ide, 在Windows/Linux下做python开发我通常使用两款IDE:

    • WingIDE

      • 官网下载地址

      • 支持Windows/Linux/Mac OS

        • 6.x注册机:

          import string
          import random
          import sha
          
          BASE16 = '0123456789ABCDEF'
          BASE30 = '123456789ABCDEFGHJKLMNPQRTVWXY'
          
          
          def randomstring(size=20, chars=string.ascii_uppercase + string.digits):
              return ''.join((random.choice(chars) for _ in range(size)))
          
          
          def BaseConvert(number, fromdigits, todigits, ignore_negative=True):
              if not ignore_negative and str(number)[0] == '-':
                  number = str(number)[1:]
                  neg = 1
              else:
                  neg = 0
              x = long(0)
              for digit in str(number):
                  x = x * len(fromdigits) + fromdigits.index(digit)
          
              res = ''
              while x 0:
                  digit = x % len(todigits)
                  res = todigits[digit] + res
                  x /= len(todigits)
          
              if neg:
                  res = '-' + res
              return res
          
          
          def AddHyphens(code):
              return code[:5] + '-' + code[5:10] + '-' + code[10:15] + '-' + code[15:]
          
          
          def SHAToBase30(digest):
              tdigest = ''.join([c for i, c in enumerate(digest) if i / 2 * 2 == i])
              result = BaseConvert(tdigest, BASE16, BASE30)
              while len(result) < 17:
                  result = '1' + result
              return result
          
          
          def loop(ecx, lichash):
              part = 0
              for c in lichash:
                  part = ecx * part + ord(c) & 1048575
              return part
          
          rng = AddHyphens('EN' + randomstring(18, '123456789ABCDEFGHJKLMNPQRTVWXY'))
          print 'License id: ' + rng
          act30 = raw_input('Enter request code:')
          lichash = act30
          hasher = sha.new()
          hasher.update(act30)
          hasher.update(rng)
          lichash = AddHyphens(lichash[:3] + SHAToBase30(hasher.hexdigest().upper()))
          part5 = format(loop(23, lichash), '05x') + format(loop(161, lichash), '05x') + format(loop(47, lichash),
                                                                                                '05x') + format(loop(9, lichash),
                                                                                                                '05x')
          part5 = BaseConvert(part5.upper(), BASE16, BASE30)
          while len(part5) < 17:
              part5 = '1' + part5
          
          part5 = 'AXX' + part5
          print 'Activation code: ' + AddHyphens(part5)
          
        • 5.x注册机:

          # -*- coding: cp936 -*-
          import sha
          import string
          
          BASE2 = '01'
          BASE10 = '0123456789'
          BASE16 = '0123456789ABCDEF'
          BASE30 = '123456789ABCDEFGHJKLMNPQRTVWXY'
          BASE36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
          BASE62 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
          BASEMAX = string.printable
          def BaseConvert(number, fromdigits, todigits, ignore_negative = True):
              """ converts a "number" between two bases of arbitrary digits
              
              The input number is assumed to be a string of digits from the
              fromdigits string (which is in order of smallest to largest
              digit). The return value is a string of elements from todigits
              (ordered in the same way). The input and output bases are
              determined from the lengths of the digit strings. Negative 
              signs are passed through.
              
              decimal to binary
              baseconvert(555,BASE10,BASE2)
              '1000101011'
              
              binary to decimal
              baseconvert('1000101011',BASE2,BASE10)
              '555'
              
              integer interpreted as binary and converted to decimal (!)
              baseconvert(1000101011,BASE2,BASE10)
              '555'
              
              base10 to base4
              baseconvert(99,BASE10,"0123")
              '1203'
              
              base4 to base5 (with alphabetic digits)
              baseconvert(1203,"0123","abcde")
              'dee'
              
              base5, alpha digits back to base 10
              baseconvert('dee',"abcde",BASE10)
              '99'
              
              decimal to a base that uses A-Z0-9a-z for its digits
              baseconvert(257938572394L,BASE10,BASE62)
              'E78Lxik'
              
              ..convert back
              baseconvert('E78Lxik',BASE62,BASE10)
              '257938572394'
              
              binary to a base with words for digits (the function cannot convert this back)
              baseconvert('1101',BASE2,('Zero','One'))
              'OneOneZeroOne'
              
              """
              if not ignore_negative and str(number)[0] == '-':
                  number = str(number)[1:]
                  neg = 1
              else:
                  neg = 0
              x = long(0)
              for digit in str(number):
                  x = x * len(fromdigits) + fromdigits.index(digit)
          
              res = ''
              while x 0:
                  digit = x % len(todigits)
                  res = todigits[digit] + res
                  x /= len(todigits)
          
              if neg:
                  res = '-' + res
              return res
          
          def SHAToBase30(digest):
              """Convert from a hexdigest form SHA hash into a more compact and
              ergonomic BASE30 representation.  This results in a 17 'digit' 
              number."""
              tdigest = ''.join([ c for i, c in enumerate(digest) if i / 2 * 2 == i ])
              result = BaseConvert(tdigest, BASE16, BASE30)
              while len(result) < 17:
                  result = '1' + result
          
              return result
          def AddHyphens(code):
              """Insert hyphens into given license id or activation request to
              make it easier to read"""
              return code[:5] + '-' + code[5:10] + '-' + code[10:15] + '-' + code[15:]
          
          LicenseID ='EN223-57414-34329-41119'
          #Copy the Request Code from the dialog
          RequestCode ='RW63E-7E4R8-DPX1P-KKECN'
          
          hasher = sha.new()
          hasher.update(RequestCode)
          hasher.update(LicenseID)
          digest = hasher.hexdigest().upper()
          lichash = RequestCode[:3] + SHAToBase30(digest)
          lichash = AddHyphens(lichash)
          
          #Calculate the Activation Code
          data = [7, 123, 23, 87]
          tmp = 0
          realcode = ''
          for i in data:
              for j in lichash:
                  tmp = (tmp * i + ord(j)) & 0xFFFFF
              realcode += format(tmp, '=05X')
              tmp = 0
          
          act30 = BaseConvert(realcode, BASE16, BASE30)
          while len(act30) < 17:
              act30 = '1' + act30
          act30 = 'AXX' + act30
          act30 = AddHyphens(act30)
          print "The Activation Code is: " + act30
          
    • PyCharm

    相关文章

      网友评论

          本文标题:python 入门 第0篇: 开篇

          本文链接:https://www.haomeiwen.com/subject/ieqncftx.html