内容简要:
1. python简介
2. Python能做什么 3. Python性能优化工具 4. Python执行过程 5. Python解释器/种类 6. Python基本编程风格 7. 变量 8. 内嵌保留字 9. 安装Python 10. Hello World 11. Print输出格式 12. Python数据类型 13. 常用内置函数 14. 常用数学运算 15. 比较运算 16. Python模块 17. 控制流一. Python简介
Python(发音:/ˈpaɪθɑːn/),是一种面向对象、直译式的计算机程序语言,具有近二十年的发展历史。它包含了一组功能完备的标准库,能够轻松完成很多常见的任务。它的语法简单,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。官方站点:
二. Python能做什么?
Python是一门综合性的语言,几乎能用python在计算机上做任何事情,下面列举几个最广泛的方面:
1. 网络应用:Web站点(Django\Tornado\Flash等框架)、服务器后台服务(Twisted网络服务框架 )以及牛13的eventlet异步通信框架等;
2. 科学运算:随着NumPy、matplotlib、ETS等众多程序库的开发,Python越来越适合于做科学运算;
3. GUI程序:包括PyQt、WxPython,自带的有Tkinter等;
4. 系统管理工具:可以用python轻松的开发一些自动化运维、监控的工具,当下比较流行的诸多开源软件好多都是用python开发的,如自动话配置工具SaltStack、Ansible,私有云解决方案Openstack等;
5. 其他实现:爬虫、游戏后台等等,总之很牛逼。。。
三. Python的性能优化工具:
Psyco:Python语言的扩展模块,即时对程序代码进行算法优化,可以一定程度上提高程序执行速度,尤其是程序中有大量循环时,现在已经停止维护; Shed Skin,Python编译器,能够将Python代码转换成优化的C++代码;四. Python 执行过程:
source code --> Complier ---> bytecode --> PVM Interpreter ---> processor
.py .pyc五. Python解释器/种类:
CPython,原始、标准官方的实现方式,用C语言开发,
Jython,用于和Java语言集成的实现,把Python代码直接编译成java字节码执行;IPython,基于CPython之上的一个交互解释器,交互上非常直观,但是执行代码功能和CPython完全一样;IronPython,用于和.NET框架集成的实现,可以直接把python代码编译成.Net的字节码PyPy,使用python语言实现的Python解释器,是动态编译器,是Psyco的后继项目;可运行在Linux的32、64位、MacOSX和Windows的32位平台上
六. Python的基本编程风格:
注释,第一行开始
#!/usr/bin/env python
文档
通过__doc__,可以查看的帮助信息,如print(id.__doc__),可以获取id内嵌函数的帮助信息;
缩进
建议:统一缩进四个空格
标识符名称
见名知意
$ vim first.py#!/usr/bin/env python "This is a test scripts"print('hello world')print('bye!')
cnfol@ubuntu:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import firsthello worldbye!>>> print(first.__doc__)This is a test scripts
七. 变量:
1. 单一下划线开始的变量名(_x)不会被“from module import *”导入
2. 前后都有下划线的变量名(__x__)是系统变量,对python解释器有特殊意义;
如:
__name__ 调用当前模块的名称,或者理解为导入了当前模块的名称__main__ 如果模块是自己执行的,默认就是__main__ 每个模块都有一个名为__name__的内建变量,此变量的值会根据调用此模块的方式发生变化
如果此文件被作为模块导入,则__name__的值为模块名称;
如果此文件被直接执行,则__name__的值为”__main__“3. 两个下划线开头,但是结尾没有下划线的变量(__x)是类的本地变量;
4. 交互模式下,只有单个下划线的变量名(_x)用于保存最后表达式的结果;
Python中的内嵌保留字(Python3)
False class finally is return None continue for lambda try True from nonlocal while and del global not with as elif if or yieldassert else import pass break except in raise
八. 实例、类、方法:
Python程序中保存的所有数据都是围绕“对象”展开的:
程序中存储的所有数据都是对象
每个对象都有一个身份(id)、一个类型(type)和一个值()>>> name = 'daniel'>>> id(name)23051200>>> type(name)>>> name'daniel'
对象的类型也称为对象的类别,用于描述对象的内部表示及它支持的方法和操作;
创建特定类型的对象时,有时也将该对象成为该类型的实例实例被创建后,其身份和类型就不可改变对象值可变,为可变对象不可修改,为不可变对象如果某个对象包含对其他对象的引用,则成为容器,如列表大多数对象都拥有大量特有的数据属性和方法属性:与对象相关的值,可以直接获取,如用print方法:被调用时将在对象上执行某些操作的函数,调用使用()运算符;使用点(.)运算符可以访问属性和方法;访问属性: >>> print num.real访问方法: >>> num.real()class:自定义类型时使用
type:内置的类型,和class指的是一个意思 instance:实例,任何对象都是有类实例化而来的每一种对象都是由其类生成的。
类,由数据和操作这片数据的函数组成,对类中的这片函数称为方法;用类实例出一个对象时,类本身只是描述了一种抽象属性,只有把这种抽象属性实例出来才叫做对象;对象本身只包含了数据,方法是属于类的;在python中一切皆对象,对象其实就是"类"实例化而来的,有的是内置类,用户也可以自定义类;
九. 安装Python:
*nix平台上系统自带python,windows平台直接去Python官网下载相对应平台的版本,然后按照安装向导完成安装即可,此处选择Python3.5.1,安装过程略...
IDE:
推荐使用Pycharm,可以从官方站点下载对应的版本安装即可,Pycharm有社区版(免费)和专业版,官方站点:
十. Hello World:
>pythonPython 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> print('hello world')hello world>>>
在Linux平台下(Python3.5)创建一个Python脚本:
1. $ vim first.py # python脚本以.py结尾,不是必须,但是理应遵循的一个命令规范,看文件后缀就能知道是个Python程序
2. 输入代码:
#!/usr/bin/env python print('hello world')
第一行#!/usr/bin/env python,声明脚本调用的解释器类型;print打印,类似于shell中的echo
3. 执行:
$ python first.py
执行可以用上述直接调用python解释器执行,也可以给脚本赋予执行权限,而后. first.py,注意,第二种方式在脚本首行务必添加声明脚本执行解释器行。
十一. Print输出格式:
print "String %format1 %format2..." %(variable1,variable2,...)
d,i 十进制整数或长整数u 无符号整数或长整数o 八进制整数或长整数x 十六进制整数或长整数X 十六进制整数(大写字母)f 浮点数,如[-]m.dddddde 浮点数,如[-]m.dddddde+xxE 浮点数,如[-]m.ddddddE+xxg,G 指数小于-4或更高精度时使用%e或者%E,否则使用%fs 字符串或者任意对象。格式化代码使用str()生成字符串r 同repr()生成的字符串c 单个字符% 字面量%,就是显示自身十二. Python的数据类型:
内置(核心)数据类型
数字:int, long, float, complex(负数), bool字符:str, unicode 列表:List字典:dict元组:tuple文件:file其他:集合(set)、冻结集合(frozenset), 类类型, None( 空)十三. Python常用的内置函数:
id(),查看对象指向内存指>>> name = 'daniel'
>>> name = 'daniel'>>> id(name)4324613008
type(),获取对象类型
>>> type(name)
len() 获取对象长度
>>> len(name)6
input(),获取用户键盘输入
>>> name = input('Please your name:')Please your name:Daniel>>> name'Daniel'
Python3.x里的input捕获到用户输入数据为str类型,如果需要用户输入int类型,需要加int()来转换如下:
>>> age = input('Age?')Age?18>>> type(age)>>> age1 = int(input('Age?'))Age?19>>> type(age1)
raw_input() 获取用户键盘输入,这个是python2中的语法,python3中已经废弃;
两者的区别是input捕获到用户的键盘输入不做更改,用户输入类型是什么,就是什么类型,而raw_input,会默认为str类型;
dir(__builtins__),显示系统内嵌模块
>>> name = 'daniel'>>> dir(name)['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
help(),显示内嵌模块帮助,如显示str用法,help(str)
>>> help(str)退出请按q
callable() 查看对象是否可以调用,可以调用为真,否则为假
>>> name = 'Daniel'>>> callable(name)False>>> def name1():... print(name)... >>> >>> callable(name1)True
十四. Python数学运算:
>>>print 1+9 # 加法
>>>print 1.3-4 # 减法>>>print 3*5 # 乘法>>>print 4.5/1.5 # 除法>>>print 3**2 # 乘方 >>>print 10%3 # 求余数,取模x // y, 截断除法,只取第一段整数结果-x, 一元减法+x, 一元加法十五. Python比较运算:
x << y 左移,如,58<<1, 左移动一位就是乘以2,两位就是乘以4...
二进制表示: 128 64 32 16 8 4 2 1 58 0 0 1 1 1 0 1 0<<1 0 1 1 1 0 1 0 0 = 116>>> 58 << 1116>>> 58 << 2232
x >> y 右移,其实右移动一位就是除以2取整,右移动2为就是除以4取整...;
二进制表示: 128 64 32 16 8 4 2 1 58 0 0 1 1 1 0 1 0>>1 0 0 0 1 1 1 0 1 = 29
>>> 58 >> 1
29
>>> 58 >> 2
14
x & 7 按位与,二进制中的两个数,二进制都为1时,结果为1,否则为0;
二进制表示: 128 64 32 16 8 4 2 1 58 0 0 1 1 1 0 1 025 0 0 0 1 1 0 0 1& 0 0 0 1 1 0 0 0 = 24
>>> 58 & 25
24
x | y 按位或,二进制中的两个数,二级制有1时,结果都为1,否则为0;
二进制表示: 58 0 0 1 1 1 0 1 025 0 0 0 1 1 0 0 1| 0 0 1 1 1 0 1 1 = 59
>>> 58|25
59x ^ y 按位异或,二进制中的两个数,二进位相异时,相同为0,不同为1;
二进制表示: 58 0 0 1 1 1 0 1 025 0 0 0 1 1 0 0 1^ 0 0 1 0 0 0 1 1 = 35
>>> 58^25
35~x 按位求反,-(x+1),正变负,负变正;
>>> ~58
-59
>>> ~-1
0
>>> ~-11
10
>>> ~10
-11
十六. Python模块
牛X的python有着非常强大标准库和异常牛逼的第三方库,能帮助开发者完成各种需求。先列两个简单的:
1. OS模块
是Python标准库中用于访问操作系统功能的模块。
首先导入模块:
>>> import os
查看帮助信息:
>>> help(os)
列出模块常用的方法:
>>> dir(os)['CLD_CONTINUED', 'CLD_DUMPED', 'CLD_EXITED', 'CLD_TRAPPED', 'EX_CANTCREAT', 'EX_CONFIG', 'EX_DATAERR', 'EX_IOERR', 'EX_NOHOST', 'EX_NOINPUT', 'EX_NOPERM', 'EX_NOUSER', 'EX_OK', 'EX_OSERR', 'EX_OSFILE', 'EX_PROTOCOL', 'EX_SOFTWARE', 'EX_TEMPFAIL', 'EX_UNAVAILABLE', 'EX_USAGE', 'F_LOCK', 'F_OK', 'F_TEST', 'F_TLOCK', 'F_ULOCK', 'MutableMapping', 'NGROUPS_MAX', 'O_ACCMODE', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_DIRECTORY', 'O_DSYNC', 'O_EXCL', 'O_EXLOCK', 'O_NDELAY', 'O_NOCTTY', 'O_NOFOLLOW', 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_SHLOCK', 'O_SYNC', 'O_TRUNC', 'O_WRONLY', 'PRIO_PGRP', 'PRIO_PROCESS', 'PRIO_USER', 'P_ALL', 'P_NOWAIT', 'P_NOWAITO', 'P_PGID', 'P_PID', 'P_WAIT', 'RTLD_GLOBAL', 'RTLD_LAZY', 'RTLD_LOCAL', 'RTLD_NODELETE', 'RTLD_NOLOAD', 'RTLD_NOW', 'R_OK', 'SCHED_FIFO', 'SCHED_OTHER', 'SCHED_RR', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'ST_NOSUID', 'ST_RDONLY', 'TMP_MAX', 'WCONTINUED', 'WCOREDUMP', 'WEXITED', 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED', 'WIFSTOPPED', 'WNOHANG', 'WNOWAIT', 'WSTOPPED', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_get_exports_list', '_putenv', '_spawnvef', '_unsetenv', '_wrap_close', 'abort', 'access', 'altsep', 'chdir', 'chflags', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'cpu_count', 'ctermid', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'environb', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fchdir', 'fchmod', 'fchown', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fsdecode', 'fsencode', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'get_blocking', 'get_exec_path', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getegid', 'getenv', 'getenvb', 'geteuid', 'getgid', 'getgrouplist', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getpriority', 'getsid', 'getuid', 'initgroups', 'isatty', 'kill', 'killpg', 'lchflags', 'lchmod', 'lchown', 'linesep', 'link', 'listdir', 'lockf', 'lseek', 'lstat', 'major', 'makedev', 'makedirs', 'minor', 'mkdir', 'mkfifo', 'mknod', 'name', 'nice', 'open', 'openpty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pipe', 'popen', 'pread', 'putenv', 'pwrite', 'read', 'readlink', 'readv', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sched_get_priority_max', 'sched_get_priority_min', 'sched_yield', 'sendfile', 'sep', 'set_blocking', 'set_inheritable', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setpriority', 'setregid', 'setreuid', 'setsid', 'setuid', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv', 'spawnve', 'spawnvp', 'spawnvpe', 'st', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sync', 'sys', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'terminal_size', 'times', 'times_result', 'truncate', 'ttyname', 'umask', 'uname', 'uname_result', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitpid', 'walk', 'write', 'writev']
常用方法:
system,调用本地系统命令
如查看系统磁盘使用量:>>> os.system('df -Th')Filesystem Type Size Used Avail Use% Mounted on/dev/mapper/vg_template-lv_root ext4 45G 17G 27G 39% /tmpfs tmpfs 939M 0 939M 0% /dev/shm/dev/vda1 ext4 485M 33M 427M 8% /boot172.16.30.251:/data/Deployment nfs 14T 12T 1.8T 87% /mnt
popen,保存命令执行结果,而不是执行结果返回的状态值
>>> a = os.popen('df -h')>>> print(a.read())Filesystem Size Used Avail Capacity iused ifree %iused Mounted on/dev/disk1 233Gi 148Gi 84Gi 64% 38899509 22081737 64% /devfs 185Ki 185Ki 0Bi 100% 639 0 100% /devmap -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /netmap auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /home
2. getpass模块
Python标准库,秉承*nix输入密码风格不显示输入信息的风格
>>> import getpass>>> dir(getpass)['GetPassWarning', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_raw_input', 'contextlib', 'fallback_getpass', 'getpass', 'getuser', 'io', 'os', 'sys', 'termios', 'unix_getpass', 'warnings', 'win_getpass']获取当前用户>>> getpass.getuser()'daniel'获取用户输入的密码信息>>> password=getpass.getpass()Password: >>> print(password)Woyebuzhidaomimashisha
十七. 控制流
1. if..else
需求:判断用户输入的用户名和密码是否正确,如正确就打印欢迎登陆,错误提示用户名或密码错误,结合getpass模块:
#!/usr/bin/env python# -*- coding: utf-8 -*-import getpassuser = 'daniel'password = 'nicai'input_user = input('Username?')input_pass = getpass.getpass('Password?')if input_user == user and input_pass == password: print('欢迎登陆,%s' %input_user)else: print('用户名或者密码错误,请稍后再试')
2. while
循环,满足条件进入循环:
还是上面的需求,允许用户输入尝试三次,如果连续三次失败的话,退出程序,使用while循环来处理:
#!/usr/bin/env python3# -*- coding: utf-8 -*-import getpassuser = 'daniel'password = 'nicai'Count = 0 #定义一个标志位while True: if Count < 3: input_user = input('Username?') input_pass = getpass.getpass('Password?') if input_user == user and input_pass == password: print('欢迎登陆,%s' %input_user) break #成功后直接跳出循环 else: print('用户名或密码输入错误,请重试!') else: Continue_flag = input('输入错误次数过多,是否继续?y/n') if Continue_flag == 'y': Count = 0 continue else: break Count += 1
3. for..in
继续完善上面的需求,允许用户输入尝试三次,如果连续三次失败的话,退出程序:
#!/usr/bin/env python3# -*- coding: utf-8 -*-import getpassuser = 'daniel'password = 'nicai'Count = 0 #定义一个标志位for i in range(10): if Count < 3: input_user = input('Username?') input_pass = getpass.getpass('Password?') if input_user == user and input_pass == password: print('欢迎登陆,%s' %input_user) break #成功后直接跳出循环 else: print('用户名或密码输入错误,请重试!') else: Continue_flag = input('输入错误次数过多,是否继续?y/n') if Continue_flag == 'y': Count = 0 continue else: break Count += 1