SlideShare a Scribd company logo
Lesson 1
          By Will Zhou
willzhou@heliumfx.com
   简单、易学
    Python语言是少有的一种可以称得上即简单又功能强大的编程语言。你将惊喜地发现Python语言是多么地简单,
    它注重的是如何解决问题而不是编程语言的语法和结构。
   免费、开源
    你可以获取Python的源代码,对其进行改进。比如Stackless Python,就是修改过的增强版本Python。
   高阶语言
    高阶语言的一个重要特性就是,你不用顾忌程序在内存上的分配和释放等底层细节。
   跨平台、可移植性
    你可以在Linux,Windows,Mac OS X和Solaris等操作系统上使用Python,不涉及硬件和系统细节的程序,一般
    100%兼容。
   解释性
    与解释语言不同的另外一种语言就是编译语言。编译语言要生成最终可执行代码,需要通过编译器编译;而解释语
    言则可以通过调用解释器直接执行所编写的代码。
   面向对象
    面向对象编程,即Object-Oriented Programming,是一种现代化的程序设计方法,大大增加代码的可重复利用
    性。设计大型程序,必不可少。Python的面向对象实现,有别于C++和Java,它强大且简单。
   可扩展性
    你可以通过C++来编写核心部分,然后通过Python调用。比如Houdini的_hou.so就是C++开发的Python模块。
   可嵌入性
    比如Houdini和Nuke支持的Python表达式。
   丰富的库
    庞大的标准库,还有很多其他高质量的库,几乎应有尽有。
   管理文件系统
    ◦ 深层次结构目录和文件的管理
    ◦ 用Python实现Job System及相关工具

   开发Tactic、Shotgun等流程管理类软件的插件和模块

   Qube!、HQueue等渲染农场队列管理工具也集成了Python

   扩展MoinMoin Wiki

   访问、管理数据库

   XLS、CSV等表格处理
   HOM – Houdini Object Module

   HDA

   hou.session

   Shelf

   Houdini的远程调用方式
    ◦ RunPythonStatements() 通过Javascript执行XML代码
    ◦ Houxmlrpc

   Hython – 比如我们自己开发的灯光组用渲染命令
   SOHO – Scripted Output of Houdini Objects
   TCL Expression
    [ python {#PYTHON_STATEMENTS#} ]
   Rotopaint
    用Python来辅助进行Roto工作
   Knobs
   Toolbars ( menu.py )
   init.py
   Metadata
   Callbacks
   Rendering
    nuke.execute(―Write1‖, 101, 200, 1)
   多多练习

   多看代码

   学以致用
Ubuntu Linux 下,一般默认就安装好了;
    Mac OS X 下?也默认安装好了,嘿嘿 ^_^
    Windows?啥也没安装 T_T。WTF ?!


   通过二进制包安装
    从www.python.org去下载一个……双击……一般请安装在C盘。如C:Python25。


   通过编译安装
    我没这么装过……因为需要事先安装Visual C++之类的编译器,较为麻烦
    ORZ……
   开始学习一门新的语言,首要就是掌握如何用它来打印一行‚Hello, World‛。


   Simon Cozens说:‚它是编程之神的传统咒语,可以帮助你更好的学习语言。‛


        #!/usr/bin/env python
        # Filename: helloworld.py
        # Date:
        # Author:
        # Usage: chmod +x helloworld.py
        #         ./helloworld.py

        print ―Hello World‖
   整数 - int
    比如42就是一个整数
   长整数 - long
    ‚长一点‛的整数。比如2222222222222222。
   浮点数 - float
    就是数学中的小数。比如4.2,4.2e-2(即0.042)。
   复数 - complex
    4+2j就表示复数。其中4是该复数的实部,2则是虚部。
   使用单引号
    ‗Hello World‘
   使用双引号
    ―Hello World‖
   使用三引号(python特有)
    ‗‗‗Hello World ‘‘‘
   转义符
    

   自然字符串
    r‘…..‘

   Unicode字符串
    u‘…..‘

   字符串级连
    ‗hello‘ ‗world‘
   在Python中常量就是值本身

    比如1,‚1‛,1.1,‚1.1‛等等…

   用什么存储常量?变量

   变量的‚名字‛——标识符:

    ◦ 标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线‘ _’。

    ◦ 标识符名称的其他部分可以由字母(大写或小写)、下划线‘ _ ‘或数字(0-9)组成。

    ◦ 标识符名称是对大小写敏感的。例如,mysop和mySop不是同一个标识符。注意前者中的小s
     和后者中的大S。

    ◦ 有效标识符名称的例子:

     i、mySop、__name和a1b2_c3。

    ◦ 无效标识符名称的例子:

     2things、this is spaced out和my-name。
   _、__42、_42_、__42__、42__和42_,那个是正确的标识符?
    哪个是错误的标识符?
#!/usr/bin/env python
# Filename: var_test.py

i = 42
print i
i = 42 + 1
print i
s = ‗Hello World‘
print s
s = ‗‗‗this is a long long long long
long long long line‘‘‘
Lesson 2
          By Will Zhou
willzhou@heliumfx.com
   算术运算
    ◦   + 加
    ◦   -  减
    ◦   *  乘
    ◦   /  除
    ◦   ** 幂
    ◦   // 取整除
    ◦   %  取模
>>> 1 + 1
2
>>> -2 – 3
-5
>>> 2 * 3
6
>>> 2 ** 3
8
>>> 8.0 / 3.0
2.6666666666666665
>>> 8.0 // 3.0
2.0
>>> 8.0 % 3.0
2.0
   位运算
    ◦ << 左移
      5 << 1 == 10   <- 0101 << 1 == 1010 ( 二进制 )
    ◦ >> 右移
      5 >> 1 == ?
    ◦ & 按位与
      5 & 2 == 0     <- 0101 & 0010 == 0000 ( 二进制 )
    ◦ | 按位或
      5 | 2 == 7     <- ?
    ◦ ^ 按位异或
      5^2
    ◦ ~ 按位反
      ~X => -(X+1)
   逻辑运算
    ◦ < 小于
      1<2 -> True
    ◦ > 大于
      1>2 -> False
    ◦ <= 小于等于
    ◦ >= 大于等于
    ◦ == 等于
      1+1 == 2 -> True
    ◦ != 不等于
      1+1 != 3 -> True
    ◦ not 布尔非
      not 1<2 -> False
    ◦ and 布尔与
      2>1 and 3>2 -> True
    ◦ or 布尔或
      2<1 or 3>2 -> True
运算符                描述
运算符
        lambda             Lambda表达式
优先级表
        or                 或
        and                与
从低到高
        not                非
 (部分)
        in,not in          成员测试
        is,is not          同一性测试
        <,<=,>,>=,!=,==    比较
        |,^,&              三个位运算,优先级分别是|低,^高,&最高
        <<,>>              移位
        +,-                加法、减法
        *,/,%              乘法、除法、取模
        +X,-X              正负号
        ~X                 按位反
        **                 指数
        (EXPRESSION, … )   绑定或元组
运算符优先级
    运算符优先级表决定了哪个运算符在别的运算符之前计算
    可以使用圆括号改变它们的计算顺序


       #!/usr/bin/env python
       # Filename: simple_gray.py
       # Author: Will Zhou
       # Date: 2010-07-29 14:09:01

       r = 0.3
       g = 0.8
       b = 0.6
       gray = 0.3*r + 0.6*g + 0.1*b
       print gray
       r = g = b = gray
Nuke 演示
预览效果
if - elif - else 条件语句

    #!/usr/bin/env python
    # coding=utf8
    # Filename: hfs_selector.py

    import sys
    if len(sys.argv) == 2: # 判断是否有2个参数(包括默认参数)
        ver = sys.argv[1]      # 将命令行获取的参数赋给变量ver
        if ver == ―10.0.595:‖ # 判断ver的值是否为字符串‖10.0.595‖
            print ―cd /opt/hfs10.0.595‖
            print ―source houdini_setup‖
            print ―cd –‖
        elif ver == ―11.0.446‖: # 如果不是,则继续判断
            print ―cd /opt/hfs11.0.446‖
            print ―source houdini_setup‖
            print ―cd –‖
        else:     # 否则,就干嘛……
            print ―echo Sorry, there is no such version houdini‖
while 循环

   #!/usr/bin/env python
   # coding=utf8
   # Filename: image_check.py
   # Description: This code should be run in Nuke.

   import os
   import thread

   def check():
     # 如果图片不存在则继续循环
     while not os.path.exists(‗d:/test.tga‘):
        pass         # pass在程序不具体做什么的时候很好用
     # 循环退出的时候,将立刻执行下面的语句
     nuke.message(‗The image is ready!‘)

   thread.start_new_thread(check, ())
while 循环




Nuke 演示
while 循环




Nuke 演示结果
for 循环



   #!/usr/bin/env python
   # coding=utf8
   # Filename: for.py
   # Description: This code should be run in Houdini.

   import hou

   grid1 = hou.node(‗/obj/geo1/grid1‘) # 获取创建好的grid对象
   points = grid1.geometry().points()  # 返回一个点序列
   for point in points:      # 用 for 循环遍历序列中的各个点
      print point.position() # 打印点的坐标
for 循环




Houdini 演示
break 和 continue 语句


    break语句
     是用来终止循环语句的,即哪怕循环条件没有称为False或序列还没
     有被完全递归,也停止执行循环语句。

    continue语句
     被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下
     一轮循环。
break 和 continue 语句


   #!/usr/bin/env python
   # Filename: break.py
                           #!/usr/bin/env python
                           # Filename: continue.py
   i=1
                           i=1
   while i < 10:
     print i
                           while i < 10:
     if i > 5:
                             print i
         i=i+1
                             if i > 5:
         break
                                 i=i+1
     else:
                                 continue
         i=i+1
                             else:
     print ‗break‘
                                 i=i+1
                             print ‗continue‘
1.   将 if 判断语句的代码例子,仔细的输入编辑器(如vim)中,保存
     名为 hfs_selector.py 的源代码文件,然后在终端中调用python命
     令执行该代码。将代码执行后的输出结果,在Linux终端执行一遍,
     然后思考一下整个过程。

2.   分别用while和for循环编写一个程序,程序的作用是打印出以下内
     容:

                   wof00101
                   wof00102
                   wof00103
                   wof00104
                   wof00105
#--------- while -----------#
第2题参考程序
          i=1
          while i<10:
                  print i
                  i = i +1

          # ---------- for ----------- #

          for i in range(1, 10):
                    print i
如何利用循环嵌套,使程序做更多的事
                                           wof00101
                                           wof00102
                                           wof00103
 #!/usr/bin/env python                     wof00104
 # coding=utf8                             wof00105
 # Filename: shot_codes.py                    …
 # Author: Will Zhou                       wof00201
 # Description: print the shot codes.      wof00202
 #                                            …
                                           wof00301
 for i in range(1,4):                      wof00302
    for j in range(1, 6):                     …
           print ‗wof%03d%02d‘ % ( i, j)   wof00305
Lesson 3
          By Will Zhou
willzhou@heliumfx.com
如何定义一个函数


  #!/usr/bin/env python
  # coding=utf8
  # Filename: print_hello.py
  #

  # 函数用def关键字定义,def后面是函数名,
  # 圆括号内则是函数的参数,
  # 冒号后的缩进内容是函数体。

  def printHelloWorld():       # 函数名为printHelloWorld,无参数
    print ‗Hello World!‘       # 函数体

  printHelloWorld()
带参数的函数


 #!/usr/bin/env python
 # coding=utf8
 # Filename: name_fix.py
 #

 def nameFix(filename): # filename是函数nameFixing的参数
     return filename.lower() # filename必须是字符串
                             # 字符串自带有lower、upper等函数
 # 注意,这里的filename与函数内的filename是不一样的
 filename = ‗WOF00101_Efx_TeST_V001‘
 print ‗BEFORE:‘, filename

 filename = nameFix(filename)
 print ‗AFTER:‘, filename
带默认值的参数

#!/usr/bin/env python
# coding=utf8
# Filename: version_change.py

def versionChange(filename, ver=‗001‘): # ver是带有默认值的参数
  ‗‘‘ This function is used to change file versions‘‘‘ # 这是DocStrings
                                                       # help()函数会读取这个
  oldver = filename[-3:]
  filename = filename.replace(oldver, ver)
  return filename

filename = ‗wof00101_efx_test_v002‘
print ‗BEFORE:‘, filename

filename = versionChange(filename)
print ‗DEFAULT:‘, filename

filename = versionChange(filename, ver=‗009‘)
print ‗NEW:‘, filename
递归函数


 #!/usr/bin/env python
 # coding=utf8
 # Filename: remkdir.py
 # Author: Will Zhou
 # Description: 创建目录的时候,同时创建其父目录,即层层创建

 def remkdir(folder):
   import os

   if os.path.exists(folder): return # 如果存在,则用return跳出
   parent = os.path.dirname(folder)
   remkdir(parent) # 函数递归,跳出递归之后,将执行下面的语句
   if not os.path.exists(folder):
      os.mkdir(folder)
应用举例
 #!/usr/bin/env python
 # coding=utf8
 # Filename: doublesave.py
 # Description: 保存hip文件的同时,备份文件至指定目录
 #             本代码请保存至$HOME/houdini10.0/scripts/python/doublesave.py

 def doublesave(backup=r"/home/will/backup/"):
   import os
   import hou

   hip_path = hou.getenv('HIP')

   backup_path = ‗/‘.join([backup, hip_path])
   remkdir(backup_path) # 在backup变量指定的目录里,递归创建原hip文件的路径

   filename = os.path.basename(hou.hipFile.name())
   back_file = ‗/‘.join([backup_path, filename])
   hou.hipFile.save(back_file)
   hou.ui.displayMessage(‗Backup to %s‘ % back_file)

   origFile = os.path.join(hip_path, filename)
   hou.hipFile.save(origFile)
应用举例
from .. import .. 语句



   # import 和 from…import…的区别
   # 请看下面程序

   import os
   os.mkdir(―new_dir‖)

   from os import mkdir
   mkdir(―new_dir‖)

   # 一般来说,应该尽量用 import,因为 from…import…会涉及到命
   # 名污染(命名冲突)等问题。
模块的 __name__


  #!/usr/bin/env python
  # Filename: print_hello.py
  # 说明:
  # 1. 每个模块都有 __name__
  # 2. __name__ == ‗__main__‘ 的作用是防止模块被import
  # 的时候执行某些代码
  # 3. 用python命令直接执行本程序的时候,
  # __name__ == ‗__main__‘ 下的子语句才会被执行
  #

  def printHello():
      print ‗Hello World‘
  if __name__ == ‗__main__‘:
      printHello()
如何调用自己的模块




      #!/usr/bin/env python
      # Filename: main.py

      from print_hello import printHello

      if __name__ == ‗__main__‘:
          printHello()
用dir函数查看模块



       # 比如自己创建的模块 print_hello

       import print_hello

       dir(print_hello)

       # 也可以查看标准库及任何第三方的模块

       import os

       dir(os)
list - 列表
list是处理一组有序元素的数据结构。


    #!/usr/bin/env python
    # Filename: list.py
    #

    projects = [‗WOF‘, ‗CRD‘, ‗SIX‘, ‗TCM‘, ‗BWE‘ ]

    counts = len(projects)

    print ―There are %d projects we‘re working in progress‖ % counts

    print projects[0]
    print projects[-1]
    print projects[2:4] # 4为开区间,真正输出的是第2和第3这两个元素

    projects.append(‗ABC‘)
    print projects
tuple – 元组
元组和列表十分类似,只不过元组和字符串一样是不可变的,即你不能修改元组。


    #!/usr/bin/env python
    # Filename: tuple.py
    #

    projects = (‗WOF‘, ‗CRD‘, ‗SIX‘, ‗TCM‘, ‗BWE‘ )

    counts = len(projects)

    print ―There are %d projects we‘re working in progress‖ % counts

    print projects[0]
    print projects[2:2] # 思考下这个输出哪个元素,然后再验证是否正确

    projects.append(‗ABC‘) # 错误
dict – 字典

字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,
即,我们把键(名字)和值(详细情况)联系在一起。

注意,键必须是唯一的。   #!/usr/bin/env python
              # Filename: dict.py

              tasks = {‗Alex‘:‘EFX‘,
                        ‗Mark‘:‘CMP‘,
                        ‗Boris‘:‘RnD‘,
                        }

              print tasks.get(‗Boris‘)
              print tasks[‗Boris‘]

              tasks.keys()
              tasks.values()
              tasks.items()
引用


     #!/usr/bin/env python
     # coding=utf8
     # Filename: reference.py

     shoplist = ['apple', 'mango', 'carrot', 'banana']
     mylist = shoplist # mylist是另外一个指向同shoplist所指的对象的名字
     del shoplist[0]
     print ‗shoplist is‘, shoplist # 两者输出一致
     print ‗mylist is‘, mylist     # mylist这时就是shoplist的一个引用

     mylist = shoplist[:]            # 拷贝整个shoplist的切片
     del mylist[0]                   # 删除第一个元素
     print ‗shoplist is‘, shoplist   # 两者已经各有所指
     print ‗mylist is‘, mylist       # mylist不是shotlist的引用
字符串高级操作

     startswith / endswith

     upper / lower

     find / index

     replace

     split

     strip

     join

     isdigit

     isalpha

More Related Content

What's hot

Python變數與資料運算
Python變數與資料運算Python變數與資料運算
Python變數與資料運算
吳錫修 (ShyiShiou Wu)
 
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言
鍾誠 陳鍾誠
 
系統程式 -- 第 8 章
系統程式 -- 第 8 章系統程式 -- 第 8 章
系統程式 -- 第 8 章
鍾誠 陳鍾誠
 
系統程式 -- 第 4 章
系統程式 -- 第 4 章系統程式 -- 第 4 章
系統程式 -- 第 4 章
鍾誠 陳鍾誠
 
Python学习笔记
Python学习笔记Python学习笔记
Python学习笔记
Lingfei Kong
 
系統程式 -- 第 7 章
系統程式 -- 第 7 章系統程式 -- 第 7 章
系統程式 -- 第 7 章
鍾誠 陳鍾誠
 
系統程式 - 附錄
系統程式 - 附錄系統程式 - 附錄
系統程式 - 附錄
鍾誠 陳鍾誠
 
Python基本資料運算
Python基本資料運算Python基本資料運算
Python基本資料運算
吳錫修 (ShyiShiou Wu)
 
建置Python開發環境
建置Python開發環境建置Python開發環境
建置Python開發環境
吳錫修 (ShyiShiou Wu)
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集shademoon
 
Hello world 的一生
Hello world 的一生Hello world 的一生
Hello world 的一生
Wen Liao
 
教青少年寫程式
教青少年寫程式教青少年寫程式
教青少年寫程式
Renyuan Lyu
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Li Hsuan Hung
 
系統程式 -- 第 5 章 連結與載入
系統程式 -- 第 5 章 連結與載入系統程式 -- 第 5 章 連結與載入
系統程式 -- 第 5 章 連結與載入
鍾誠 陳鍾誠
 
系統程式 -- 第 3 章 組合語言
系統程式 -- 第 3 章 組合語言系統程式 -- 第 3 章 組合語言
系統程式 -- 第 3 章 組合語言
鍾誠 陳鍾誠
 
Bash shell script 教學
Bash shell script 教學Bash shell script 教學
Bash shell script 教學
Ming-Sian Lin
 
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
鍾誠 陳鍾誠
 
系統程式 -- 第 5 章
系統程式 -- 第 5 章系統程式 -- 第 5 章
系統程式 -- 第 5 章
鍾誠 陳鍾誠
 
如何設計電腦 -- 還有讓電腦變快的那些方法
如何設計電腦  -- 還有讓電腦變快的那些方法如何設計電腦  -- 還有讓電腦變快的那些方法
如何設計電腦 -- 還有讓電腦變快的那些方法
鍾誠 陳鍾誠
 
10 檔案說明與處理
10 檔案說明與處理10 檔案說明與處理
10 檔案說明與處理shademoon
 

What's hot (20)

Python變數與資料運算
Python變數與資料運算Python變數與資料運算
Python變數與資料運算
 
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言系統程式 -- 第 7 章 高階語言
系統程式 -- 第 7 章 高階語言
 
系統程式 -- 第 8 章
系統程式 -- 第 8 章系統程式 -- 第 8 章
系統程式 -- 第 8 章
 
系統程式 -- 第 4 章
系統程式 -- 第 4 章系統程式 -- 第 4 章
系統程式 -- 第 4 章
 
Python学习笔记
Python学习笔记Python学习笔记
Python学习笔记
 
系統程式 -- 第 7 章
系統程式 -- 第 7 章系統程式 -- 第 7 章
系統程式 -- 第 7 章
 
系統程式 - 附錄
系統程式 - 附錄系統程式 - 附錄
系統程式 - 附錄
 
Python基本資料運算
Python基本資料運算Python基本資料運算
Python基本資料運算
 
建置Python開發環境
建置Python開發環境建置Python開發環境
建置Python開發環境
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
 
Hello world 的一生
Hello world 的一生Hello world 的一生
Hello world 的一生
 
教青少年寫程式
教青少年寫程式教青少年寫程式
教青少年寫程式
 
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VMCompiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
Compiler for Dummy 一點都不深入的了解 Compiler, Interpreter 和 VM
 
系統程式 -- 第 5 章 連結與載入
系統程式 -- 第 5 章 連結與載入系統程式 -- 第 5 章 連結與載入
系統程式 -- 第 5 章 連結與載入
 
系統程式 -- 第 3 章 組合語言
系統程式 -- 第 3 章 組合語言系統程式 -- 第 3 章 組合語言
系統程式 -- 第 3 章 組合語言
 
Bash shell script 教學
Bash shell script 教學Bash shell script 教學
Bash shell script 教學
 
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
 
系統程式 -- 第 5 章
系統程式 -- 第 5 章系統程式 -- 第 5 章
系統程式 -- 第 5 章
 
如何設計電腦 -- 還有讓電腦變快的那些方法
如何設計電腦  -- 還有讓電腦變快的那些方法如何設計電腦  -- 還有讓電腦變快的那些方法
如何設計電腦 -- 還有讓電腦變快的那些方法
 
10 檔案說明與處理
10 檔案說明與處理10 檔案說明與處理
10 檔案說明與處理
 

Viewers also liked

Kevin Jovel
Kevin JovelKevin Jovel
Kevin Jovel
guest34cd97
 
Elearning20
Elearning20Elearning20
Elearning20
VICTOR123
 
Dibujandoenelpizarrn
DibujandoenelpizarrnDibujandoenelpizarrn
Dibujandoenelpizarrn
luisvilc
 
My Accounts
My AccountsMy Accounts
My Accounts
FAH
 
Intro
IntroIntro
Intro
bspremo
 
Maya Python (PyMel)
Maya Python (PyMel)Maya Python (PyMel)
Maya Python (PyMel)
Melanie Torres Bisbal
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
Luminary Labs
 

Viewers also liked (7)

Kevin Jovel
Kevin JovelKevin Jovel
Kevin Jovel
 
Elearning20
Elearning20Elearning20
Elearning20
 
Dibujandoenelpizarrn
DibujandoenelpizarrnDibujandoenelpizarrn
Dibujandoenelpizarrn
 
My Accounts
My AccountsMy Accounts
My Accounts
 
Intro
IntroIntro
Intro
 
Maya Python (PyMel)
Maya Python (PyMel)Maya Python (PyMel)
Maya Python (PyMel)
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 

Similar to Learning python in the motion picture industry by will zhou

模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
czzz1
 
Python速成指南
Python速成指南Python速成指南
Python速成指南
March Liu
 
02.python基础
02.python基础02.python基础
02.python基础
modou li
 
Introduce to Linux command line
Introduce to Linux command lineIntroduce to Linux command line
Introduce to Linux command line
Wen Liao
 
Vim hacks
Vim hacksVim hacks
Vim hacks
XuYj
 
Effective linux.1.(commandline)
Effective linux.1.(commandline)Effective linux.1.(commandline)
Effective linux.1.(commandline)
wang hongjiang
 
Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)
Chu-Siang Lai
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
勇浩 赖
 
dbug in mysql
dbug in mysqldbug in mysql
dbug in mysql
Tim Chou
 
LCC Retarget C Compiler Introduction in Chinese
LCC Retarget C Compiler Introduction in ChineseLCC Retarget C Compiler Introduction in Chinese
LCC Retarget C Compiler Introduction in Chinese
Marco Wang
 
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
永立 連
 
Cfengine培训文档 刘天斯
Cfengine培训文档 刘天斯Cfengine培训文档 刘天斯
Cfengine培训文档 刘天斯
liuts
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
Chong-Kuan Chen
 
OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IHung-yu Lin
 
Bigdata 大資料分析實務 (進階上機課程)
Bigdata 大資料分析實務 (進階上機課程)Bigdata 大資料分析實務 (進階上機課程)
Bigdata 大資料分析實務 (進階上機課程)
家雋 莊
 
Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門
吳錫修 (ShyiShiou Wu)
 
makefile20141121
makefile20141121makefile20141121
makefile20141121Kevin Wu
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18
Derek Lee
 

Similar to Learning python in the motion picture industry by will zhou (20)

模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
Python速成指南
Python速成指南Python速成指南
Python速成指南
 
02.python基础
02.python基础02.python基础
02.python基础
 
Introduce to Linux command line
Introduce to Linux command lineIntroduce to Linux command line
Introduce to Linux command line
 
Vim hacks
Vim hacksVim hacks
Vim hacks
 
Effective linux.1.(commandline)
Effective linux.1.(commandline)Effective linux.1.(commandline)
Effective linux.1.(commandline)
 
Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)Automate with Ansible basic (2/e)
Automate with Ansible basic (2/e)
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
dbug in mysql
dbug in mysqldbug in mysql
dbug in mysql
 
LCC Retarget C Compiler Introduction in Chinese
LCC Retarget C Compiler Introduction in ChineseLCC Retarget C Compiler Introduction in Chinese
LCC Retarget C Compiler Introduction in Chinese
 
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
 
Cfengine培训文档 刘天斯
Cfengine培训文档 刘天斯Cfengine培训文档 刘天斯
Cfengine培训文档 刘天斯
 
HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享HITCON CTF 2014 BambooFox 解題心得分享
HITCON CTF 2014 BambooFox 解題心得分享
 
OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part I
 
Bigdata 大資料分析實務 (進階上機課程)
Bigdata 大資料分析實務 (進階上機課程)Bigdata 大資料分析實務 (進階上機課程)
Bigdata 大資料分析實務 (進階上機課程)
 
Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門Arduino應用系統設計 - Arduino程式快速入門
Arduino應用系統設計 - Arduino程式快速入門
 
makefile20141121
makefile20141121makefile20141121
makefile20141121
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18
 

Learning python in the motion picture industry by will zhou

  • 1. Lesson 1 By Will Zhou willzhou@heliumfx.com
  • 2. 简单、易学 Python语言是少有的一种可以称得上即简单又功能强大的编程语言。你将惊喜地发现Python语言是多么地简单, 它注重的是如何解决问题而不是编程语言的语法和结构。  免费、开源 你可以获取Python的源代码,对其进行改进。比如Stackless Python,就是修改过的增强版本Python。  高阶语言 高阶语言的一个重要特性就是,你不用顾忌程序在内存上的分配和释放等底层细节。  跨平台、可移植性 你可以在Linux,Windows,Mac OS X和Solaris等操作系统上使用Python,不涉及硬件和系统细节的程序,一般 100%兼容。  解释性 与解释语言不同的另外一种语言就是编译语言。编译语言要生成最终可执行代码,需要通过编译器编译;而解释语 言则可以通过调用解释器直接执行所编写的代码。  面向对象 面向对象编程,即Object-Oriented Programming,是一种现代化的程序设计方法,大大增加代码的可重复利用 性。设计大型程序,必不可少。Python的面向对象实现,有别于C++和Java,它强大且简单。  可扩展性 你可以通过C++来编写核心部分,然后通过Python调用。比如Houdini的_hou.so就是C++开发的Python模块。  可嵌入性 比如Houdini和Nuke支持的Python表达式。  丰富的库 庞大的标准库,还有很多其他高质量的库,几乎应有尽有。
  • 3. 管理文件系统 ◦ 深层次结构目录和文件的管理 ◦ 用Python实现Job System及相关工具  开发Tactic、Shotgun等流程管理类软件的插件和模块  Qube!、HQueue等渲染农场队列管理工具也集成了Python  扩展MoinMoin Wiki  访问、管理数据库  XLS、CSV等表格处理
  • 4. HOM – Houdini Object Module  HDA  hou.session  Shelf  Houdini的远程调用方式 ◦ RunPythonStatements() 通过Javascript执行XML代码 ◦ Houxmlrpc  Hython – 比如我们自己开发的灯光组用渲染命令  SOHO – Scripted Output of Houdini Objects
  • 5.
  • 6. TCL Expression [ python {#PYTHON_STATEMENTS#} ]  Rotopaint 用Python来辅助进行Roto工作  Knobs  Toolbars ( menu.py )  init.py  Metadata  Callbacks  Rendering nuke.execute(―Write1‖, 101, 200, 1)
  • 7. 多多练习  多看代码  学以致用
  • 8. Ubuntu Linux 下,一般默认就安装好了; Mac OS X 下?也默认安装好了,嘿嘿 ^_^ Windows?啥也没安装 T_T。WTF ?!  通过二进制包安装 从www.python.org去下载一个……双击……一般请安装在C盘。如C:Python25。  通过编译安装 我没这么装过……因为需要事先安装Visual C++之类的编译器,较为麻烦 ORZ……
  • 9. 开始学习一门新的语言,首要就是掌握如何用它来打印一行‚Hello, World‛。  Simon Cozens说:‚它是编程之神的传统咒语,可以帮助你更好的学习语言。‛ #!/usr/bin/env python # Filename: helloworld.py # Date: # Author: # Usage: chmod +x helloworld.py # ./helloworld.py print ―Hello World‖
  • 10. 整数 - int 比如42就是一个整数  长整数 - long ‚长一点‛的整数。比如2222222222222222。  浮点数 - float 就是数学中的小数。比如4.2,4.2e-2(即0.042)。  复数 - complex 4+2j就表示复数。其中4是该复数的实部,2则是虚部。
  • 11. 使用单引号 ‗Hello World‘  使用双引号 ―Hello World‖  使用三引号(python特有) ‗‗‗Hello World ‘‘‘  转义符  自然字符串 r‘…..‘  Unicode字符串 u‘…..‘  字符串级连 ‗hello‘ ‗world‘
  • 12. 在Python中常量就是值本身 比如1,‚1‛,1.1,‚1.1‛等等…  用什么存储常量?变量  变量的‚名字‛——标识符: ◦ 标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线‘ _’。 ◦ 标识符名称的其他部分可以由字母(大写或小写)、下划线‘ _ ‘或数字(0-9)组成。 ◦ 标识符名称是对大小写敏感的。例如,mysop和mySop不是同一个标识符。注意前者中的小s 和后者中的大S。 ◦ 有效标识符名称的例子: i、mySop、__name和a1b2_c3。 ◦ 无效标识符名称的例子: 2things、this is spaced out和my-name。
  • 13. _、__42、_42_、__42__、42__和42_,那个是正确的标识符? 哪个是错误的标识符?
  • 14. #!/usr/bin/env python # Filename: var_test.py i = 42 print i i = 42 + 1 print i s = ‗Hello World‘ print s s = ‗‗‗this is a long long long long long long long line‘‘‘
  • 15. Lesson 2 By Will Zhou willzhou@heliumfx.com
  • 16. 算术运算 ◦ + 加 ◦ - 减 ◦ * 乘 ◦ / 除 ◦ ** 幂 ◦ // 取整除 ◦ % 取模
  • 17. >>> 1 + 1 2 >>> -2 – 3 -5 >>> 2 * 3 6 >>> 2 ** 3 8 >>> 8.0 / 3.0 2.6666666666666665 >>> 8.0 // 3.0 2.0 >>> 8.0 % 3.0 2.0
  • 18. 位运算 ◦ << 左移  5 << 1 == 10 <- 0101 << 1 == 1010 ( 二进制 ) ◦ >> 右移  5 >> 1 == ? ◦ & 按位与  5 & 2 == 0 <- 0101 & 0010 == 0000 ( 二进制 ) ◦ | 按位或  5 | 2 == 7 <- ? ◦ ^ 按位异或  5^2 ◦ ~ 按位反  ~X => -(X+1)
  • 19. 逻辑运算 ◦ < 小于  1<2 -> True ◦ > 大于  1>2 -> False ◦ <= 小于等于 ◦ >= 大于等于 ◦ == 等于  1+1 == 2 -> True ◦ != 不等于  1+1 != 3 -> True ◦ not 布尔非  not 1<2 -> False ◦ and 布尔与  2>1 and 3>2 -> True ◦ or 布尔或  2<1 or 3>2 -> True
  • 20. 运算符 描述 运算符 lambda Lambda表达式 优先级表 or 或 and 与 从低到高 not 非 (部分) in,not in 成员测试 is,is not 同一性测试 <,<=,>,>=,!=,== 比较 |,^,& 三个位运算,优先级分别是|低,^高,&最高 <<,>> 移位 +,- 加法、减法 *,/,% 乘法、除法、取模 +X,-X 正负号 ~X 按位反 ** 指数 (EXPRESSION, … ) 绑定或元组
  • 21. 运算符优先级  运算符优先级表决定了哪个运算符在别的运算符之前计算  可以使用圆括号改变它们的计算顺序 #!/usr/bin/env python # Filename: simple_gray.py # Author: Will Zhou # Date: 2010-07-29 14:09:01 r = 0.3 g = 0.8 b = 0.6 gray = 0.3*r + 0.6*g + 0.1*b print gray r = g = b = gray
  • 24. if - elif - else 条件语句 #!/usr/bin/env python # coding=utf8 # Filename: hfs_selector.py import sys if len(sys.argv) == 2: # 判断是否有2个参数(包括默认参数) ver = sys.argv[1] # 将命令行获取的参数赋给变量ver if ver == ―10.0.595:‖ # 判断ver的值是否为字符串‖10.0.595‖ print ―cd /opt/hfs10.0.595‖ print ―source houdini_setup‖ print ―cd –‖ elif ver == ―11.0.446‖: # 如果不是,则继续判断 print ―cd /opt/hfs11.0.446‖ print ―source houdini_setup‖ print ―cd –‖ else: # 否则,就干嘛…… print ―echo Sorry, there is no such version houdini‖
  • 25. while 循环 #!/usr/bin/env python # coding=utf8 # Filename: image_check.py # Description: This code should be run in Nuke. import os import thread def check(): # 如果图片不存在则继续循环 while not os.path.exists(‗d:/test.tga‘): pass # pass在程序不具体做什么的时候很好用 # 循环退出的时候,将立刻执行下面的语句 nuke.message(‗The image is ready!‘) thread.start_new_thread(check, ())
  • 28. for 循环 #!/usr/bin/env python # coding=utf8 # Filename: for.py # Description: This code should be run in Houdini. import hou grid1 = hou.node(‗/obj/geo1/grid1‘) # 获取创建好的grid对象 points = grid1.geometry().points() # 返回一个点序列 for point in points: # 用 for 循环遍历序列中的各个点 print point.position() # 打印点的坐标
  • 30. break 和 continue 语句  break语句 是用来终止循环语句的,即哪怕循环条件没有称为False或序列还没 有被完全递归,也停止执行循环语句。  continue语句 被用来告诉Python跳过当前循环块中的剩余语句,然后继续进行下 一轮循环。
  • 31. break 和 continue 语句 #!/usr/bin/env python # Filename: break.py #!/usr/bin/env python # Filename: continue.py i=1 i=1 while i < 10: print i while i < 10: if i > 5: print i i=i+1 if i > 5: break i=i+1 else: continue i=i+1 else: print ‗break‘ i=i+1 print ‗continue‘
  • 32. 1. 将 if 判断语句的代码例子,仔细的输入编辑器(如vim)中,保存 名为 hfs_selector.py 的源代码文件,然后在终端中调用python命 令执行该代码。将代码执行后的输出结果,在Linux终端执行一遍, 然后思考一下整个过程。 2. 分别用while和for循环编写一个程序,程序的作用是打印出以下内 容: wof00101 wof00102 wof00103 wof00104 wof00105
  • 33. #--------- while -----------# 第2题参考程序 i=1 while i<10: print i i = i +1 # ---------- for ----------- # for i in range(1, 10): print i
  • 34. 如何利用循环嵌套,使程序做更多的事 wof00101 wof00102 wof00103 #!/usr/bin/env python wof00104 # coding=utf8 wof00105 # Filename: shot_codes.py … # Author: Will Zhou wof00201 # Description: print the shot codes. wof00202 # … wof00301 for i in range(1,4): wof00302 for j in range(1, 6): … print ‗wof%03d%02d‘ % ( i, j) wof00305
  • 35. Lesson 3 By Will Zhou willzhou@heliumfx.com
  • 36. 如何定义一个函数 #!/usr/bin/env python # coding=utf8 # Filename: print_hello.py # # 函数用def关键字定义,def后面是函数名, # 圆括号内则是函数的参数, # 冒号后的缩进内容是函数体。 def printHelloWorld(): # 函数名为printHelloWorld,无参数 print ‗Hello World!‘ # 函数体 printHelloWorld()
  • 37. 带参数的函数 #!/usr/bin/env python # coding=utf8 # Filename: name_fix.py # def nameFix(filename): # filename是函数nameFixing的参数 return filename.lower() # filename必须是字符串 # 字符串自带有lower、upper等函数 # 注意,这里的filename与函数内的filename是不一样的 filename = ‗WOF00101_Efx_TeST_V001‘ print ‗BEFORE:‘, filename filename = nameFix(filename) print ‗AFTER:‘, filename
  • 38. 带默认值的参数 #!/usr/bin/env python # coding=utf8 # Filename: version_change.py def versionChange(filename, ver=‗001‘): # ver是带有默认值的参数 ‗‘‘ This function is used to change file versions‘‘‘ # 这是DocStrings # help()函数会读取这个 oldver = filename[-3:] filename = filename.replace(oldver, ver) return filename filename = ‗wof00101_efx_test_v002‘ print ‗BEFORE:‘, filename filename = versionChange(filename) print ‗DEFAULT:‘, filename filename = versionChange(filename, ver=‗009‘) print ‗NEW:‘, filename
  • 39. 递归函数 #!/usr/bin/env python # coding=utf8 # Filename: remkdir.py # Author: Will Zhou # Description: 创建目录的时候,同时创建其父目录,即层层创建 def remkdir(folder): import os if os.path.exists(folder): return # 如果存在,则用return跳出 parent = os.path.dirname(folder) remkdir(parent) # 函数递归,跳出递归之后,将执行下面的语句 if not os.path.exists(folder): os.mkdir(folder)
  • 40. 应用举例 #!/usr/bin/env python # coding=utf8 # Filename: doublesave.py # Description: 保存hip文件的同时,备份文件至指定目录 # 本代码请保存至$HOME/houdini10.0/scripts/python/doublesave.py def doublesave(backup=r"/home/will/backup/"): import os import hou hip_path = hou.getenv('HIP') backup_path = ‗/‘.join([backup, hip_path]) remkdir(backup_path) # 在backup变量指定的目录里,递归创建原hip文件的路径 filename = os.path.basename(hou.hipFile.name()) back_file = ‗/‘.join([backup_path, filename]) hou.hipFile.save(back_file) hou.ui.displayMessage(‗Backup to %s‘ % back_file) origFile = os.path.join(hip_path, filename) hou.hipFile.save(origFile)
  • 42. from .. import .. 语句 # import 和 from…import…的区别 # 请看下面程序 import os os.mkdir(―new_dir‖) from os import mkdir mkdir(―new_dir‖) # 一般来说,应该尽量用 import,因为 from…import…会涉及到命 # 名污染(命名冲突)等问题。
  • 43. 模块的 __name__ #!/usr/bin/env python # Filename: print_hello.py # 说明: # 1. 每个模块都有 __name__ # 2. __name__ == ‗__main__‘ 的作用是防止模块被import # 的时候执行某些代码 # 3. 用python命令直接执行本程序的时候, # __name__ == ‗__main__‘ 下的子语句才会被执行 # def printHello(): print ‗Hello World‘ if __name__ == ‗__main__‘: printHello()
  • 44. 如何调用自己的模块 #!/usr/bin/env python # Filename: main.py from print_hello import printHello if __name__ == ‗__main__‘: printHello()
  • 45. 用dir函数查看模块 # 比如自己创建的模块 print_hello import print_hello dir(print_hello) # 也可以查看标准库及任何第三方的模块 import os dir(os)
  • 46. list - 列表 list是处理一组有序元素的数据结构。 #!/usr/bin/env python # Filename: list.py # projects = [‗WOF‘, ‗CRD‘, ‗SIX‘, ‗TCM‘, ‗BWE‘ ] counts = len(projects) print ―There are %d projects we‘re working in progress‖ % counts print projects[0] print projects[-1] print projects[2:4] # 4为开区间,真正输出的是第2和第3这两个元素 projects.append(‗ABC‘) print projects
  • 47. tuple – 元组 元组和列表十分类似,只不过元组和字符串一样是不可变的,即你不能修改元组。 #!/usr/bin/env python # Filename: tuple.py # projects = (‗WOF‘, ‗CRD‘, ‗SIX‘, ‗TCM‘, ‗BWE‘ ) counts = len(projects) print ―There are %d projects we‘re working in progress‖ % counts print projects[0] print projects[2:2] # 思考下这个输出哪个元素,然后再验证是否正确 projects.append(‗ABC‘) # 错误
  • 48. dict – 字典 字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿, 即,我们把键(名字)和值(详细情况)联系在一起。 注意,键必须是唯一的。 #!/usr/bin/env python # Filename: dict.py tasks = {‗Alex‘:‘EFX‘, ‗Mark‘:‘CMP‘, ‗Boris‘:‘RnD‘, } print tasks.get(‗Boris‘) print tasks[‗Boris‘] tasks.keys() tasks.values() tasks.items()
  • 49. 引用 #!/usr/bin/env python # coding=utf8 # Filename: reference.py shoplist = ['apple', 'mango', 'carrot', 'banana'] mylist = shoplist # mylist是另外一个指向同shoplist所指的对象的名字 del shoplist[0] print ‗shoplist is‘, shoplist # 两者输出一致 print ‗mylist is‘, mylist # mylist这时就是shoplist的一个引用 mylist = shoplist[:] # 拷贝整个shoplist的切片 del mylist[0] # 删除第一个元素 print ‗shoplist is‘, shoplist # 两者已经各有所指 print ‗mylist is‘, mylist # mylist不是shotlist的引用
  • 50. 字符串高级操作  startswith / endswith  upper / lower  find / index  replace  split  strip  join  isdigit  isalpha