Python-if语句
条件语句、、
1) if 语句
例子:
# 执行if语句内的程序
a = input("a:")
b = input("b:")
if(a > b):
print a, " > ", b
Note:如果是在pydev+eclipse下,运行然后输入数字,打个回车就会出现“SyntaxError:unexpected EOF while parsing”,所以只能用raw_input来代替。原因是回车,编译器都多读一个/r,一般按回车后,shells 会输入“/n”,但因为Eclipse控制台输入的是“/r/n”,python就不能很好的识别,可以说这是Python的一个bug。
# 跳过if语句
a = input("a:")
b = input("b:")
if(a > b):
print a, " > ", b
print a, " < ", b
# if else语句
a = input("a:")
b = input("b:")
if(a > b):
print a, " > ", b
else:
print a, " < ", b
Note:input()he raw_input. Raw_input( )捕获用户的原始输入,raw_input()函数的声明如下所示:
Raw_input([prompt])->string,参数prompt是控制台输出的提示文字,提示用户输入。返回值为字符串。如果输入的是数字,返回的还是字符串。
Input( )支持用户输入数字或表达式,不支持输入字符串。Input( )函数的声明如下所示:
Input([prompt])->value。
2) if…elif…else语句
例子:
# if elif else语句
score = raw_input("score:")
score=int(score)
if(score >= 90) and (score <= 100):
print "A"
elif(score >= 80) and (score < 90):
print "B"
elif(score >= 60) and (score < 80):
print "C"
else:
print "D"
3) if语句的嵌套
编写条件语句时,应该尽量避免使用嵌套语句。嵌套语句不便于阅读,而且可能会忽略一些可能性。
例子:
x = -1
y = 99
if(x >= 0):
if(x > 0): #嵌套的if语句
y = 1
else:
y = 0
else:
y = -1
print "y =", y
输出为y=-1
4) 实现switch语句的功能
Python并没有提供switch语句,Python可以通过字典实现switch语句的功能。
实现方法分两步。首先,定义一个字典。字典是由键值对组成的集合。其次,调用字典的get()获取相应的表达式。
例子:
from __future__ import division
x = 1
y = 2
operator = "/"
result = {
"+" : x + y,
"-" : x - y,
"*" : x * y,
"/" : x / y
}
print result.get(operator)
输出为0.5
另一种使用switch分支语句的方案是创建一个switch类,处理程序的流程。
a) 创建一个switch类,该类继承自Python的祖先类object。调用构造函数init( )初始化需要匹配的字符串,并需要定义两个成员变量value和fall。Value用于存放需要匹配的字符串,fall用于记录是否匹配成功,初始值为false,标识匹配不成功。如果匹配成功,程序往后执行。
b) 定义一个match( )方法,该方法用于用于匹配case子句。这里需要考虑三种情况:首先是匹配成功的情况,其次是匹配失败的默认case子句,最后是case子句中没有使用break中断的情况。
c) 重写__iter__( )方法,定义该方法后才能使switch类用于循环语句中。__iter__( )调用match( )方法进行匹配。通过yield保留字,使函数可以在循环中迭代。此外,调用StopIteration异常中断循环。
d) 编写调用代码,在for…in…循环中使用switch类。
例子:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class switch(object):
def __init__(self, value): # 初始化需要匹配的值value
self.value = value
self.fall = False # 如果匹配到的case语句中没有break,则fall为true。
def __iter__(self):
yield self.match # 调用match方法 返回一个生成器
raise StopIteration # StopIteration 异常来判断for循环是否结束
def match(self, *args): # 模拟case子句的方法
if self.fall or not args: # 如果fall为true,则继续执行下面的case子句
# 或case子句没有匹配项,则流转到默认分支。
return True
elif self.value in args: # 匹配成功
self.fall = True
return True
else: # 匹配失败
return False
operator = "+"
x = 1
y = 2
for case in switch(operator): # switch只能用于for in循环中
if case('+'):
print x + y
break
if case('-'):
print x - y
break
if case('*'):
print x * y
break
if case('/'):
print x / y
break
if case(): # 默认分支
print ""
输出为3
【已解决】Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
【问题】
一个python脚本,本来都运行好好的,然后写了几行代码,而且也都确保每行都对齐了,但是运行的时候,却出现语法错误:
IndentationError: unindent does not match any outer indentation level
【解决过程】
1.对于此错误,最常见的原因是,的确没有对齐。但是我根据错误提示的行数,去代码中看了下,没啥问题啊。
都是用TAB键,对齐好了的,没有不对齐的行数啊。
2.以为是前面的注释的内容影响后面的语句的语法了,所以把前面的注释也删除了。
结果还是此语法错误。
3.后来折腾了半天,突然想到了,把当前python脚本的所有字符都显示出来看看有没有啥特殊的字符。
当前用的文本编辑器Notepad++,好像有个设置,可以显示所有的字符的。
找到了,在:
视图 -> 显示符号 -> 显示空格与制表符
然后就看出问题来了:
原来错误的行数是1580行:
但是源码的1580行的对齐用的是点点点的空格,是和前面的几行的对齐所用的箭头表示的TAB键,是不匹配的,即代码的对齐,混用了TAB键和空格:
而新的Python语法,是不支持的代码对齐中,混用TAB和空格的。所以出现上述错误提示了。
知道原因了,解决起来就简单了:
去把对应的TAB,都改为空格,统一一下对齐的风格,即可。
在Notepad++中,去:
设置->首选项:
语言->以空格取代(TAB键):
即可实现,对于以后每次的TAB输入,都自动转换为4个空格。
【总结】
Python中遇到IndentationError,以后第一时间就要想到,是不是由于TAB键和空格混搭使用了。
估计很多人也都是此类原因导致的。记得统一一下就好。
常用函数
abs() :返回绝对值;
cmath.sqrt() :返回平方根,可以用于负数;
float() :转为浮点型数;
int() :转为整形数;
long() :转为长整型数;
math.ceil() :返回上入值,类型为浮点;
math.floor() :返回下舍值,类型为浮点;
math.sqrt() :返回平方根,不适用于负数;
pow(x ,y[, z]) :返回x的y次幂(所得结果对z取模);
round(number[, ndigits]) :对给定的精度对数字四舍五入;
str() :转换为字符串;
repr() :返回字符串形式;
input() :获取用户输入;
raw_input() :获取用户输入并转为字符串;
help() :提供交互帮助;
例:
变量、语句、输入和输出
类似C语言中的 %d、%f 功能,不过 python 取变量指向的值用也要加个 % ,%(x * y);
函数与模块
例:
import 类似导入函数库的功能,在 python 中函数库成为模块,然后调用某个函数要使用 "模块名.函数名" 的方式,也可以具体导入某个函数,使用 " from 模块名 import 函数名",但是这个方法有个缺点就是在使用不同模块中有同名函数时会造成冲突;
保存并执行程序
编写好代码文件,以 .py 保存,在 shell 下输入 python 文件名 .py ;
让脚本像普通程序一样运行
在脚本首行加上 #! 解释器绝对路径,如:#!/usr/bin/env python ,如果后来升级过安装了新版本的python,旧版本python仍在系统中,那就要注意这个绝对路径到底要指向哪个python解释器;
http://www.cnblogs.com/zero86/archive/2012/11/17/2774273.html