print()函数的解释:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: 用什么来隔开多个打印项,默认是空格
end: 在打印完参数之后跟什么,一般是跟一个换行符。
flush: whether to forcibly flush the stream
print还有一个file参数,赋值一个文件指针,用来打印到文件中。
示例:
import sys
print("hello",file=sys.stdout)#输出到控制台显示器
with open(r"C:\Users\lenovo\Desktop\新建文本文档.txt","a") as fp:
print("hello",file=fp)#写到指针指向的文件中,按照指针规定的方式
>>> print("a","b")
a b
>>> print("a","b",sep="--")
a--b
>>> print("jj",end="k")
jjk>>>
异常处理
try except来处理可能的异常
try:
print(7/0)
print(3) #不会执行
except ZeroDivisionError: #除数为零的异常
print("OK")
总结
(1)print()可以打印多个字符串,默认用空格隔开,最后默认跟一个换行符。sep,end
(2)函数最后不写return一个具体值,或者不写return,就会默认return None,如print(),这就和循环最后一句默认有个continue一样。
(3)def函数定义里面的变量属于局部变量,两个函数定义中的局部变量不是共通的,即使一个函数定义里调用了另一个函数。
函数定义之外的部分属于全局作用域,一般也就是主线,里面定义的变量属于全局变量,在函数定义里可以直接使用,无需传参。在局部作用域里不能直接修改全局变量,只能直接使用,因为因为python语法的特殊性,修改变量时,是一个赋值语句,那么就会声明一个该局部变量,如果要在局部作用域修改全局变量就需要在修改之前使用global
def spam():
global eggs
eggs = 2 #此处修改的eggs是全局变量
eggs = 3
spam()
print(eggs)#结果是2
反例:
def spam():
print(eggs)#ERROR,因为下面赋值语句表明,此处eggs是一个局部变量,但此时eggs没有赋值
eggs = 3
eggs = 4
spam()
print(eggs)
全局变量出现:
- 函数定义之外的全局作用域
- 在局部作用域内,但只是读取值,没有修改
- 局部作用域内,且有global修饰
def spam():
global eggs
eggs = 2 #即使在eggs并没有在全局作用域声明,也可以直接global,并且以后在全局作用域内可以直接使用
spam()
print(eggs)
局部变量出现:
- 局部作用域内声明的变量
和java不一样,在java中比如在for循环里面声明了一个变量i,那么在for循环之外就不能使用,但是python不一样
def pp():
print("for循环里",i)
for i in range(3):
i = 3
pp()
print("循环之外",i)
for循环里 3
for循环里 3
for循环里 3
循环之外 3
在上面的函数运行时,我意外发现了一个疑惑点,为什么循环里面把i变成了3之后循环没有立即停止呢?(因为很不巧我把for循环变量设置成了i,里面又对i修改了,所以产生了疑惑)这其实是因为,这里的for循环不和java里面的一样,java通常是判断循环变量的值是否超过或小于某个值,但是pyhon里面的for循环变量是需要把列表遍历一遍才会自动退出,而不是当i的值大于列表里面的最大值之后就会退出。
注意点:
(1)
input(”请输入一个数字“)
或者
s = ”请输入一个数字“
input(s)
(2)
函数定义中的变量名成为形式参数,真正函数调用时传入的变量才叫实际参数。
(3)有关可选参数
有些函数有些参数是可选的,那是因为这些参数有着默认初始值,但是注意,有默认初始值的参数需要在函数定义时放在其他参数的后面,避免函数调用时出错。
在给定参数默认值的时候等号两边不要写空格。
函数调用时,如果不想让函数修改原列表的值,那么在函数调用的时候使用列表切片lst[ : ]
def hello(name=None,char):
print(name+" "+char)
hello("!")
(4)函数定义时的*args, **kwargs参数
*args表示任何多个无名参数,它是一个tuple
**kwargs表示关键字参数,它是一个dict
在函数调用时,前者不可以按照键值对的形式传递实际参数;后者必须按照键值对形式。
*args
def test_var_args(farg, *args):
print "formal arg:", farg
for arg in args:
print "another arg:", arg
test_var_args(1, "two", 3)
# 输出
formal arg: 1
another arg: two
another arg: 3
**kwargs
def test_var_kwargs(farg, **kwargs):
print "formal arg:", farg
for key in kwargs:
print "another keyword arg: %s: %s" % (key, kwargs[key])
test_var_kwargs(farg=1, myarg2="two", myarg3=3)
# 输出
formal arg: 1
another keyword arg: myarg2: two
another keyword arg: myarg3: 3
报错,因为当实际参数和形式参数个数不一致时,如果不具体指明是给哪个参数赋值,就会默认按照形式参数的顺序来赋值,而不会先照顾没有默认初始的参数
这个函数的定义对于调用来说就是不友好的,因该把有默认值参数(可选参数)放在最后。
(5)
对于程序中有可能出错的地方需要使用try、except,不然程序崩溃时会直接把错误信息反馈给用户,此时用可以看到详细的traceback信息,里面包括了具体文件名,还有错误的代码,这对黑客来说是极大的帮助。
try、except、finally、else
try后面跟可能出错的语句,当发生错误时就会立即执行except内的语句,不论try中的语句是否发生了错误,都会执行finally后面的语句,finally后的语句一般是做一些后事的处理,例如资源的释放,关闭文件等,也就是finally跟着try块或者except块执行,else里的语句是在try块语句没有发生错误时才会执行的。
综上:
try:
fp = open(r"C:\Users\lenovo\Desktop\entence.txt")
except FileNotFoundError: #except FileNotFoundError as e:
print("没有找到该文件")
else:
print("找到这个文件了")
finally:
fp.close()
print("文件关闭")
#没有找到该文件
#文件关闭
其中except执行的语句必须有,不能是空语句,如果实在不想执行什么,就让用户也体会不到,可以写一句pass,pass意味着什么也不做,充当占位符,还用在函数定义,还没有想好函数内部具体执行什么时候,如果什么也不写,同样是会报错的,可以写一个pass
try:
fp = open(r"kkk.txt")
except FileNotFoundError:
pass
(6)常遇到的异常类型
Exception | 可以捕获任意异常 |
---|---|
IndexError | 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5],但是切片是可以访问的 |
KeyError | 试图访问字典里不存在的键 |
TypeError | 传入对象类型与要求的不符合 |