rtpdhw01

摘要: 上来就是满满鸡汤,工作经历,作品,以及关于生活,现实性问题的探讨阐述、python历史,基础知识简介之类。

一、喂汤第一步

  1、套路一,各种美好前景,各种和牛x人士共事之经历,各种美好前程简介

  2、Follow Me,以后各种美好的生活,tesla之类,不是梦想而是目标;

   But,师傅领进门,修行靠个人,脚踏实地,沉下心来,一步一个脚印,在这个浮躁的社会,静下来才能看清楚并顺其自然实现自己的目标

 

二、编程入门仪式(生活要有仪式感,随便的人生,不会精彩)

  虽然很烦这些套路,但是仪式感,这个梗,吃 

  首先Python版本选择,工作中线上版本还是2.6版本,但是本课程是按照3.0的版本来教学的,为了方便后续的工作和学习,贪一个,

  python2.6,2.7,3.3一个不落下的全部安装上,步骤如下:

  1、下载对应版本Python安装包(Windows版本)

  2、运行下载的MSI安装包,在选择安装组件的一步时,勾上所有的组件:

  

  特别要注意选上 pip 和 Add python.exe to Path ,然后一路点“Next”即可完成安装,当然路径可以自定义。

  其他版本的python按照上述步骤处理即可

  接下来就是配置系统环境变量

   

  点击 Environment Variables 

  

  新增Python安装路径

  如:;D:\Soft\Python33\

   win + r 调用windows命令行界面

  

  出现如图界面代表环境变量配置OK

  Python多版本配置类似

  3、言归正传,hellow world! 走起

  (现在python3.x几乎已经得到所有python2.x强大的第三方库的支持)

  不选择python2.7因为官方公告,Python2.7只支持到2020年

  

 

三、变量

  变量定义:    

    1、变量名只能是字母、数字、下划线的任意组合。

    2、变量名的一个字符不能是数字。

    3、以下关键字 系统保留变量名,有特殊含义 不能声明为变量名:

    [and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,not,

    or,pass,print,raise,return,try,while,with,yield]

    4、python命名规范详述

  变量赋值:

    在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的。
    Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值那一刻被初始化,

    下面详细介绍了Python的变量赋值问题

    我们先看一下如下代码:

    

    输出结果:

    

 

    Python 属于动态语言,程序的结构可以在运行的过程中随时改变,而且 python 还是弱类型的语言,所以如果你是从静态、

    强类型编程语言转过来的,理解起 Python 的赋值,刚开始可能会感觉有些代码有点莫名其妙。

    可能你会以为上面代码的输出会是这样的:

    

    你可能认为 a 没有被改变,因为没有看到哪里对它做了改变;b 和 d 的改变是和明显的;

    c呢,因为是在函数内被改变的,你可能认为 c 会是一个局部变量,所以全局的 c 不会被改变。

    实际上,这里的 a, b, c, d 同时指向了一块内存空间,这可内存空间保存的是一个字典对象。

    这有点像 c 语言的指针,a, b, c, d 四个指针指向同一个内存地址,也就是给这块内存其了 4

    个笔名。所以,不管你改变谁,其他三个变量都会跟着变化。那为什么 c 在函数内部被改变,

    而且没有用 global 申明,但全局的 c 却被改变了呢?

    我们再来看一个例子: 

    

    当 b = a 时,a 与 b 指向同一个对象,所以在 a 中添加一个元素时,b 也发生变化。而当 a = 4 时, a 就已

    经不再指向字典对象了,而是指向一个新的 int 对象(python 中整数也是对象),这时只有 b 指向字典,所以

    a 改变时 b 没有跟着变化。这是只是说明了什么时候赋值变量会发生质的改变,而以上的问题还没有被解决。

     那么,我么再来看一个例子:

    

    由以上的实例可以了解到,如果仅改变对象的属性(或者说成是改变结构),所有指向该对象的变量都会随之改变。

    但是如果一个变量重新指向了一个对象,那么其他指向该对象的变量不会随之变化。所以,最开始的例子中,c 虽然

    在函数内部被改变,但是 c 是全局的变量,我们只是在 c 所指向的内存中添加了一个值,而没有将 c 指向另外的变量。

    需要注意的是,有人可能会认为上例中的最后一个输出应该是 d['g'].x: 8。 这样理解的原因可能是觉得已经把字典中

     ‘g' 所对应的值取出来了,并重新命名为 xx,那么 xx 就与字典无关了。其实际并不是这样的,字典中的 key 所对应的

     value 就像是一个指针指向了一片内存区域,访问字典中 key 时就是去该区域取值,如果将值取出来赋值给另外一个变量,

    例如 xx = d['g'] 或者 xx = d.get("g", None),这样只是让 xx 这个变量也指向了该区域,也就是说字典中的键 ‘g' 和 xx

     对象指向了同一片内存空间,当我们只改变 xx 的属性时,字典也会发生变化。

    下例更加直观的展示了这一点:

    

    这个知识点非常简单,但如果没有理解,可能无法看明白别人的代码。这一点有时候会给程序设计带来很大的便利,例如设计一个在整个程序中保存状态的上下文:

    

    示例中我们可以把需要保存的状态添加到 context 中,这样在整个程序的运行过程中这些状态能够被任何位置被使用。

    在来一个终结的例子,执行外部代码:

    outer_code.py

 1 from __future__ import print_function
 2  
 3 def initialize(context):
 4  g.a = 333
 5  g.b = 666
 6  context.x = 888
 7  
 8 def handle_data(context, data):
 9  g.c = g.a + g.b + context.x + context.y
10  a = np.array([1, 2, 3, 4, 5, 6])
11  print("outer space: a is %s" % a)
12  print("outer space: context is %s" % context)

main_exec.py

 1 from __future__ import print_function
 2  
 3 import sys
 4 import imp
 5 from pprint import pprint
 6  
 7 class Context(object):
 8  pass
 9  
10 class PersistentState(object):
11  pass
12  
13  
14 # Script starts from here
15  
16 if __name__ == "__main__":
17  outer_code_moudle = imp.new_module('outer_code')
18  outer_code_moudle.__file__ = 'outer_code.py'
19  sys.modules["outer_code"] = outer_code_moudle
20  outer_code_scope = code_scope = outer_code_moudle.__dict__
21  
22  head_code = "import numpy as np\nfrom main_exec import PersistentState\ng=PersistentState()"
23  exec(head_code, code_scope)
24  origin_global_names = set(code_scope.keys())
25  
26  with open("outer_code.py", "rb") as f:
27  outer_code = f.read()
28  
29  import __future__
30  code_obj = compile(outer_code, "outer_code.py", "exec", flags=__future__.unicode_literals.compiler_flag)
31  exec(code_obj, code_scope)
32  # 去除掉内建名字空间的属性,仅保留外部代码中添加的属性
33  outer_code_global_names = set(outer_code_scope.keys()) - origin_global_names
34  
35  outer_func_initialize = code_scope.get("initialize", None)
36  outer_func_handle_data = code_scope.get("handle_data", None)
37  
38  context = Context()
39  context.y = 999
40  outer_func_initialize(context)
41  outer_func_handle_data(context, None)
42  
43  g = outer_code_scope["g"]
44  assert g.c == 2886
45  print("g.c: %s" % g.c)
46  print(dir(g))
47  print(dir(context))
48  pprint(outer_code_moudle.__dict__)

    简单版变量赋值(赋值的本质):

    Python 中的变量名有些类似于C++中的指针的概念.    

 1 >>> var = 3
 2 >>> tmp = var
 3 >>> var
 4 3
 5 >>> tmp
 6 3
 7 >>> id(var)
 8 10417272
 9 >>> id(tmp)
10 10417272
11 >>> id(3)
12 10417272

  

>>> var = 4
>>> id(var)
10417260
>>> id(4)
10417260
>>> id(tmp)
10417272
>>> tmp
3
>>> var
4
>>>

    上边的例子指出, 当执行 "var = 3" 时, python会在内存中分配一块空间, 把"3"赋值给这块空间.

    然后, 将变量名 "var" 关联到分配的内存.

    当执行 "var = 4" 时, python 会再分配一块内存并存入"4", 然后将变量名 "var" 关联到"4" 所在内存.

    此时"3"所在的内存并没有变化.

    分配内存编号10417272, 存入"3"

    将"var" 关联到 10417272

    >>> var = 4 

    分配内存编号10417260, 存入"4"

    将"var" 关联到 10417260

    >>> tmp
    3

    >>> id(tmp)
    10417272

    此时10417272中的内容没有破坏, 仍然是"3", 并且"tmp"仍然指向10417272 

    事实上,当没有任何变量名指向一个内存中的变量时, python将释放该内存变量

 

四、字符编码和二进制

  二进制:由烽火戏诸侯的典故引出相关二进制表示的需求和原理,类似中国的太极,比较基础的内容,可以参考百度百科-二进制

  字符编码:Alex也粗略的讲了下,详情可以参考百度百科-字符编码

  •   ASCII、GB2312(big5是支持中文繁体的)、GBK1.0、GB18030。
  •   这里要解释的是PC端都支持GB18030。手机端只支持到GB2312。
  •   所以可能会出现乱码。 解决方法是使用utf-8。
  •   Unicode(万国码、统一码、单一码)
  •   utf-8只是其中一个格式。个人建议以后代码都使用utf-8。

  注释:

    单行注释

    多行注释

    如下图:

      

 

五、用户交互程序

  1、最简单的获取用户输入账户密码,如下图所示。

    代码:

      

    输出:

      

    By the way:input()获取到的内容,都是字符串类型(对象)

  2、低效率方法,Python实际编程中不推荐使用

    代码:

      

    输出:

      

  3、格式化字符串的一种常用方式%s %d

    如下图:

      

  4、格式化字符串之format{0}占位符

    如下图:

      

  5、格式化字符串之format {name}占位符

    如下图:

      

  6、if...elif...else判断之最简单的例子

    代码:

      

    输出:

      

  7、if...elif...else判断之完整的例子--猜年龄

    代码:

      

    基本的逻辑都很简单和清晰,具体的例子可以自己运行得到

  8、while...else...循环

    代码:

      

  9、for循环

    代码:

      

 

   10、 for循环之任性玩

    代码:

      

    有个小小的巧妙之处,善于发现,会节省很多流程,实现的方式有多种,可以多途径尝试

 

 

 

 

 

 

 

 

 

 

 

 

  

  

      

    

posted on 2017-03-02 08:54  AaronYoung  阅读(133)  评论(0)    收藏  举报

导航