python学习笔记1--初识python
人生苦短,必须性感,要想性感,先学python!
我是一个90后入行两年多的运维,现供职于一家游戏公司,现在我手里最大的项目有三个运维人员,共有4000多台服务器。面对这么庞大的服务器数量,自动化运维工具必然少不了(着重夸一下ansible,简直强大的不要不要的,爱死了),公司也开发了一些运维平台或者资产管理平台,但随着业务的发展壮大,现有的业务平台对业务的支持渐渐的跟不上脚步,只能东拼西凑。
作为一个运维人员,shell脚本还是要写的,但是越写越觉得shell脚本的局限,很多事情用shell脚本实现效率较低,而且随着运维业务搬上页面,shell脚本写的cgi程序也显得越来越吃力,当初用shell写出一些接口cgi的时候还感觉自己很牛X,其实到后来才发现自己真的是见识短浅,好多问题还是没法得到完美的解决。所以自然而然的想到了我大python。
扯了这么多,其实说白了,就是想学会python好让我升值加薪,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动呢~
--------------------------------------------------------------------------扯淡到此为止-------------------------------------------------------------------------
一、环境准备
版本:python3.5
系统:Linux/Unix/Windows/MacOS
由于我是一个运维,所以没有特殊说明的情况下,都使用linux系统,不要问我为什么不用windows,这也是情怀。
二、先写一个Hello Word!这叫情怀!
#!/usr/bin/env python3 # -*- coding:utf-8 -*- print("hello world")
#!/usr/bin/env python3 这句话的意思是声明程序的解释器是python3
# -*- coding:utf-8 -*- 这句话是声明字符编码,关于字符编码的部分,在下文中会详细记录
print("hello world") 这就是我大python的输出语句了,在python2.x的版本中,输出使用print语句,例如:print 'hello world'
三、关于变量和常量
关于变量和常量的定义,此处不再多说。
python中定义变量的方法如下:
name = 'coder zhang'
age = 18
handsome = True
变量名可以包括字母、数字、下划线,变量不能以数字开头,变量名不能是python中的关键字,如:if,else,while等。
一般情况下,变量命名可以用以下两种方式:
1、小写字母加下划线
name_of_you
2、使用驼峰法命名
NameOfYou
nameOfyou
使用固定的格式命名变量可以增加代码的可读性,使代码更加规范,逼格更高。
关于常量,就是指在代码中写死的量,在程序执行过程中这个值不会改变,习惯上常量用大写字母表示:
PIE = 3.141592653
四、字符编码
由于计算机使用二进制来进行运算,所以,当需要在计算机中表示字符,字母,符号等等的时候,二进制直接表示就没法实现了,所以,聪明的人类发明了字符编码,即规定某数字代表某字符,这样的对应规则就称为字符编码。
ASCII,此编码是计算机最早诞生时使用的字符编码,使用1字节来存储字符,最多可以表示255个字符,显然,这已经足够显示所有的英文字母以及常用符号了,所以,目光短浅的美国佬就觉得这些已经足够了,当年搞IPv4的哥们儿估计也是这么想的,呵呵。
GB 2312,此字符编码是为了表示中文,GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。
GBK 1.0,此字符编码向下兼容GB 2312,共收录了21003个汉字。
GB 18030,此字符编码有两个版本:GB18030-2000和GB18030-2005。GB18030-2000收录了27533个汉字,GB18030-2005收录了70244个汉字
Unicode,为了统一各国的字符编码方式,Unicode应运而生,这个字符编码收录了所有的地球符号,也是老牛逼了,但是此字符编码使用2字节来保存,这就意味着磁盘保存同样的文件,与ASCII相比,会多出一倍的存储空间,很明显,这很浪费。
UTF-8,这是一项伟大的发明,是的,没错。在UTF-8中,0-127号的字符用1个字节来表示,使用和US-ASCII相同的编码。这意味着1980年代写的文档用UTF-8打开一点问题都没有。只有128号及以上的字符才用2个,3个或者4个字节来表示。因此,UTF-8被称作可变长度编码。很明显,这种字符编码,完美的统一了各国的各种字符编码,并且并没有浪费过多的磁盘空间,
在python3.x中,默认使用的就是UTF-8的字符编码,但在python2.x中并不是这样,所以在代码开头要写上字符编码的声明:
# -*- coding:utf-8 -*-
#_*_ coding:utf-8 _*_
五、注释
单行注释:
python中使用#作为单行注释
多行注释:
使用一对'''或"""作为注释,多行注释还可以用于打印多行的情况,如:
info = ''' name:coder zhang age:18 job:IT '''
print(info)
运行结果如下:
name:coder zhang
age:18
job:IT
六、用户输入
python3用于接收用户输入的方法是:
input('xxxxxx')
在python2中,除了input()方法外,还有一个raw_input()方法,但该方法在python3中改为了input(),python2中input()这个方法实在蛋疼,所以被搞掉了:
python2中的raw_input()方法和python3中的input()方法完全一样,其会将所有的输入都作为字符串来接收,但是python2中的input()方法会保留用户输入的数据类型,例如,在python2中你想要输入一个字符串zhangsan,使用raw_input()方法时,用户可以直接输入zhangsan,而使用input()方法时,用户必须输入"zhangsan",就是说用户必须用引号将输入的内容引起来才行,显然,这是一种脑子长包的做法。
Python 2.7.10 (default, Oct 23 2015, 19:19:21) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> name = input('Name:') Name:zhangsan Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<string>", line 1, in <module> NameError: name 'zhangsan' is not defined >>> name = input('Name:') Name:"zhangsan" >>> print name zhangsan >>>
综上所述,在python2中,尽量不要使用input()方法,而用raw_input()方法,在python3中就直接用input()就好了,因为你也没别的选择。
由于python中input()方法会把用户输入统一按照字符串来处理,所以在必要的时候,我们需要对用户的输入做强制的类型转换:
int():强制转换为整型
str():强制转换为字符串类型
七、格式化输出
python中格式化输出有三种方式:
1、%s %d %f占位符格式化输出
2、{word1} {word2} ... .format{wrod1=value1,word2=value2,...}
3、{0} {1} ... .format{value0,value1,...}
name = input("Name:") age = int(input("Age:")) job = input("Job:") print("age typt", type(age)) #type()方法用来打印数据类型 #占位符方式格式化输出 info1 = ''' ----------------INFO1 OF %s----------------- Name:%s Age:%d Job:%s ''' % (name,name,age,job) print(info1)
#指定变量名称与值的格式化输出 info2 = ''' ----------------INFO2 OF {Name}----------------- Name:{Name} Age:{Age} Job:{Job} ''' .format(Name=name,Age=age,Job=job) print(info2)
#指定变量位置的格式化输出 info3 = ''' ----------------INFO3 OF {0}----------------- Name:{0} Age:{1} Job:{2} ''' .format(name,age,job) print(info3)
八、流程控制
python中使用强制缩进来区分流程控制,如果本身是父级的语句一定要顶格写。
1、if、if ... else、if ... elif ... else判断
2、while循环
3、for循环
用下述代码来记录上述三种流程控制结构:
#本段代码实现一个简单的猜数字的功能,用户有三次机会,当猜对是退出程序,猜错3次后让用户选择是否继续,继续则再次拥有三次尝试机会
age = 34 retry = 3 times = 0
#while循环方式
while times < retry: guess_age = int(input("Please input your number:")) if guess_age == age: print("Yes,you got it!!") break elif guess_age > age: print("Guess smaller!") times += 1 other_chance = retry - times print("You have only {times} times!".format(times=other_chance)) else: print("Guess bigger!!") times += 1 other_chance = retry - times print("You have only %d times!" % other_chance) if times == retry: continue_tag = input("Do you want continue?(Y/N)") if continue_tag == "Y": times = 0 else: print("Good Bye!!")
#for循环方式
for times in range(retry): guess_age = int(input("Please input your number:")) if guess_age == age: print("Yes,you got it!!") break elif guess_age > age: print("Guess smaller!") times += 1 other_chance = retry - times print("You have only {times} times!".format(times=other_chance)) else: print("Guess bigger!!") times += 1 other_chance = retry - times print("You have only %d times!" % other_chance) else: print("Good Bye!!")
python在循环部分不同于其他语言的地方在于其能在循环结构中使用else语句,意为当循环结束后,执行else部分的语句,这个设定简直棒呆!
九、两个方法,range()、getpass()
1、range()方法:
range()方法可以生成一个数值序列,如下代码生成一个0-4的数列:
for i in range(5): print(i)
range()方法默认从0开始,其可以设置起始数字以及步长:
#设置以数字1为起始值
for i in range(1,10): print(i)
#运行结果如下:
1
2
3
4
5
6
7
8
9
for i in range(0,10,2): print(i)
#运行结果如下:
0
2
4
6
8
从上述结果我们可以看出,range()方法在输出时会包含数值的起始值,但却不包括数值的结束值。
2、getpass()方法
getpass()方法可以用于用户在输入密码时不显示明文,使用该方法前需要先导入getpass模块:
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import getpass username = input('Please input your username:') passwd = getpass.getpass("Password") print(username,passwd)