带名字的代码块,用来完成具体的工作。
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
创建一个简单的hello函数
>>> def hello():
... print('hello,world')
...
>>> hello()
hello,world
定义函数时()里面的参数是形参,输入的值为实参,下面的列子中hello(x)为形参,7为实参
>>> def hello(x):
... return x
>>> hello(7)
7
我们可以在参数里面定义自己的默认值
>>> def hello(x,y):
... return x-y
...
>>> hello(3,7)
-4
函数返回的值为返回值
>>> def hello(x):
... return x*3
...
>>> hello(3)
9
如果传入的不是不可修改的对象比如传入的是个整数或者浮点数,函数里面虽然修改了值,但是不会改变原始对象。
如果传入的十个列表,函数里面引用的就还是这个列表,函数改变,原始变量也会改变
>>> def hello(x):
... x=2
...
>>> x=3
>>> print(x)
3
>>> hello(x)
>>> print(x)
3
我们可以发现x并没有变为2
>>> def hello(x):
... x[1]=2
>>> x=[2,4,6]
>>> hello(x)
>>> print(x)
[2, 2, 6]
可以看到x执行这个函数后改变了里面的值
返回字典
>>>def person(name,score):
person= {'name':name,'score':score}
return person
>>>person("Tom",90)
{'name': 'Tom', 'score': 90}
函数里面嵌套函数
下面的举例是函数里面嵌套函数,返回值返回的是个function,里面的x都是fun这个函数的参数x
>>>def fun(x)
def fun2(y):
return x+y
return fun2
>>> a=fun(3) ######当我们设置a=fun(3)时我们相当于传入了参数x=3,返回的a是个fun2的function。
>>> type(a)
<class 'function'>
>>> a(8) ######如果我们再次传入参数,此时就相当于传入了y值。
11
>>>def person(name,score):
person= {'name':name,'score':score}
return person
while True:
print('please tell me your name and score:')
name=input('name:')
if name == 'q':
break
score=input('score:')
if score == 'q':
break
people=person(name,score)
print(people)
please tell me your name and score:
name:Tom
score:80
{'name': 'Tom', 'score': '80'}
please tell me your name and score:
name:q
我们可以在函数中加入循环传递列表的内容
>>> def hello(x):
... for name in x:
... print('hello'+name+'!')
...
>>> t=['tom','mary','hh']
>>> hello(t)
hellotom!
hellomary!
hellohh!
在形参中加入*,表示可以传入不止一个实参
>>> def vegetable(*x):
... print(x)
...
>>> vegetable('spinage')
('spinage',)
>>> vegetable('spinage','chinese leaf')
('spinage', 'chinese leaf')
就是用函数来表示程序,用函数的组合表达程序组合的思维方式
python允许使用lambda关键字来创建匿名函数,下面通过例子来解释什么时lambda函数
####先简单定义一个函数
>>>
>>> def ds(x):
... return 2*x+1
...
>>> ds(5)
11
####用lambda表达就是可以简写成
>>> lambda x:2*x+1
<function <lambda> at 0x0000012236894EE8>
>>> g=lambda x:2*x+1
>>> g(5)
11
#####闭包的形成写lambda函数
>>> def fun(x):
... return lambda y:x+y
...
>>> tem=fun(4)
>>> tem(6)
10
filter是一个过滤器它的作用是在海量的数据里面提取出有用的信息,filter里面有两个参数,一个参数里面可以是函数,也可以是None,如果是一个函数的话,可以将第二个可迭代对象里的每个元素作为函数的参数进行计算,把返回TRUE的值计算出来,只返回TRUE的值。
>>> temp =filter(None,[1,0,False,True])
>>> list(temp)
[1, True]
#### 下面加入一个函数
>>> def odd(x):
... return x%2
...
>>> temp=filter(odd,range(10))
>>> list(temp)
[1, 3, 5, 7, 9]
map 是个映射函数,参数仍然是一个是函数,另一个是可迭代对象,支持多个可迭代对象,返回计算的结果。
>>> def odd(x):
... return x*2
...
>>> temp=map(odd,range(10))
>>> list(temp)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> list(map(lambda x,y: x+y,[1,3,5],[10,20,30]))
[11, 23, 35]
在python中,字典是一系列的键值对,每个键都与一个值相关联,可以用键来访问对应的值,与键相对应的可以是数字,字符串,列表乃至字典。
如果想要把一个班级的同学的姓名成绩保存在一个列表中,可以使用列表加元组的方式
data=[('tom',89),('mary',90),('haha',100)]
data
[('tom', 89), ('mary', 90), ('haha', 100)]
对于上面的列表如果我们想要查询列表里面有没有tom这个同学,就需要对列表里面的所有进行比较,会比较慢,所以想要根据某个特征查询所对应的值,就是字典的形式。由key_value构成的键值对,数据结构里面叫map,python里面就是字典
下面我们创建一个字典
scores={'tom':90,'mary':80,'mike':70,'jak':100}
scores
{'tom': 90, 'mary': 80, 'mike': 70, 'jak': 100}
len(scores)### 查看有多少个键值对
4
scores['tom'] ###根据键tom得到对应的值90
90
scores.get('tom')
90
scores['bob']=88 ###字典里添加键值对
scores
{'tom': 90, 'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}
scores['tom']='toom' ###修改字典中的值
scores
{'tom': 'toom', 'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}
del scores['tom'] ####删除键值对
scores
{'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}
scores
{'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}
for key,value in scores.items(): ###遍历所有的键值对
print(key)
print(value)
mary
80
mike
70
jak
100
bob
88
for name in scores.keys(): #####遍历所有的键
print(name)
mary
mike
jak
bob
for score in scores.values(): ####遍历所有的值
print(score)
80
70
100
88
scoresheet={'mike':(60,80,90),'tom':(80,70,99),'mary':(78,90,57)}
for key in scoresheet.keys():
print(key,scoresheet[key])
mike (60, 80, 90)
tom (80, 70, 99)
mary (78, 90, 57)
将字典包含在列表中
alion={'hh':1,'hhw':2,'hhh':3}
alion2={'yy':1,'yyy':2,'yyyy':3}
alion3={"uu":1,'uuu':2,"uuuu":3}
alionall=[alion,alion2,alion3]
alionall
[{'hh': 1, 'hhw': 2, 'hhh': 3},
{'yy': 1, 'yyy': 2, 'yyyy': 3},
{'uu': 1, 'uuu': 2, 'uuuu': 3}]
for alien in alionall:
print(alien)
{'hh': 1, 'hhw': 2, 'hhh': 3}
{'yy': 1, 'yyy': 2, 'yyyy': 3}
{'uu': 1, 'uuu': 2, 'uuuu': 3}
for alien in alionall[:2]:
print(alien)
{'hh': 1, 'hhw': 2, 'hhh': 3}
{'yy': 1, 'yyy': 2, 'yyyy': 3}
在字典中储存列表
apple={'color':['red','yellow'],
'shape':['round','square']}
for things in apple.values():
print(things)
['red', 'yellow']
['round', 'square']
for key in apple.keys():
print(key)
color
shape
在字典中包含字典
people={'tom':{'math':80,'english':90},
'mary':{'math':90,'english':70}}
for name,project in people.items():
print(name,project)
tom {'math': 80, 'english': 90}
mary {'math': 90, 'english': 70}
for name,pro in people.items():
print(name,pro)
tom {'math': 80, 'english': 90}
mary {'math': 90, 'english': 70}
两种创建方式,一种是直接创建,另一种用set创建。
>>> name={"tom","yamy","mary","kai"}
>>> name2=set(["tom","yamy","mary","kai"])
>>> name==name2
True
集合中的元素是无序的,不能像序列那样用下表的方式来进行访问,但是可以使用迭代的方式把集合中的数据一个个读取出来。
>>> for na in name:
... print(na)
...
kai
tom
mary
yamy
>>> name.add("haha")
>>> name
{'tom', 'haha', 'kai', 'mary', 'yamy'}
>>> name.remove('haha')
>>> name
{'tom', 'kai', 'mary', 'yamy'}
用函数frozenset将集合冰冻起来,那么集合就会变成不可变的形式,不能修改。
>>> name=frozenset({"tom","yamy","mary","kai"})
>>> name.add("hah")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
参考:菜鸟教程、python编程入门到实践 python使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明: file: 必需,文件路径(相对或者绝对路径)。 mode: 可选,文件打开模式 buffering: 设置缓冲 encoding: 一般使用utf8 errors: 报错级别 newline: 区分换行符 closefd: 传入的file参数类型 opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。 mode设置:(常用模式) r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 x 写模式,新建一个文件,如果该文件已存在则会报错 w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件 不存在,创建新文件进行写入
文件路径的输入如果是windows需要用反斜杠\
>>> fo = open("test.txt", "r+")
>>> print ("文件名为: ", fo.name)
文件名为: test.txt
>>> line = fo.read()
>>> print ("读取的字符串: %s" % (line))
读取的字符串: h
nsuiabcjkc
nsjciuabc
>>> with open('C:\\Users/lihm/Desktop/vscode/python/python05/test.txt') as file_object:
... content = file_object.read()
... print(content)
...
abcdehcb
bsudiabjs
bcshcuyb
bshcbaknca
读取文件时,如果需要检查每一行,或者查找特定的文件的信息,可能需要遍历文件内容,可以使用for循环
>>> with open('test.txt') as file:
... for line in file:
... print (line)
...
abcdehcb
bsudiabjs
bcshcuyb
bshcbaknca
我们发现逐行打印的文件空表行却增加了,是因为在文件的末尾都会有一个看不见的换行符,而print语句也会加上一个换行符,因此打印出来的都会有两个换行符,消除换行符可以使用rstrip()
>>> with open('test.txt') as file:
... for line in file:
... print (line.rstrip())
...
abcdehcb
bsudiabjs
bcshcuyb
bshcbaknca
如果要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件,附加模式打开文件时python不会清空原有的文件内容,写入的新的文件内容会添加到末尾
>>> file = open("test.txt", "r")
>>> line = file.read()
>>> print ("读取的字符串: %s" % (line))
读取的字符串: hdacjkanckdsnvkl
nsjciuabc
sxnajiscbiab
njsbcjbjsnc
################################加入字符串ttttttt
>>> fo = open("test.txt","a") #####mode改为a
>>> str = "ttttttt"
>>> fo.write(str)
7
>>> fo.close()
>>> fo = open("test.txt","r")
>>> line = fo.read()
>>> print ("读取的字符串: %s" % (line))
读取的字符串: hdacjkanckdsnvkl
nsjciuabc
sxnajiscbiab
njsbcjbjsnc
ttttttt
>>>fo=open("test2.txt","w")
>>>fo.write('I love python,I am learning python.')
>>> fo.write('I love python,I am learning python.')
35
>>> fo.close()
>>> fo =open ('test2.txt','r')
>>> fo.read()
'I love python,I am learning python.'
>>>with open('text2.txt','w') as file:
file.write('I love python,\n')
file.write('I am learning.\n')
>>> with open('text2.txt','r') as file:
... print(file.read())
...
I love python,
I am learning.
################可以直接写
>>> with open('text2.txt','w') as file:
... file.write('I love python,\nI am learning.\n')
...
30
>>> with open('text2.txt','r') as file:
... print(file.read())
...
I love python,
I am learning.
python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序 我们在编写程序的时候会出现两类错误:语法错误、语义错误。 Python的语法错误或者称之为解析错,是初学者经常碰到的,如下实例
>>> while True print('Hello world')
File "<stdin>", line 1, in ?
while True print('Hello world')
^
SyntaxError: invalid syntax
这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号 : 。
语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。
python异常:每当让python发生不知所措的错误时,他会创建一个异常对象,如果编写代码时没有编写处理该异常的代码,那么程序会停止,并且显示traceback,其中包含有关异常的报告。
>>> 10 * (1/0) # 0 不能作为除数,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3 # spam 未定义,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2 # int 不能与 str 相加,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
################读取文件时发生的一个异常
>>> f= open("text2.txt","r")
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 48: illegal multibyte sequence
#################改正
>>> f= open("text2.txt","r",encoding='UTF-8')
>>> f.read()
'人民日报周一至周五每日出对开16版。一至四版为新闻版,五至十二版为深度报道版,十三至十六版为周刊、专版。周六和周日每日出对开8版,\n一至四版
为新闻版,五至八版为专版。新闻版实行采编分开,突出时效性和新闻性。\n深度报道版实行采编合一,以政治、经济、文化、科技、国际等方面的报道为主
。周刊、专版开辟了5种周刊和其它丰富多彩的专版。'
使用try-except 代码块指出异常,可以在可能出现异常的地方设置代码提示自己出现了什么样的异常,怎么改正
>>> print(5/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> try:
... print(5/0)
... except ZeroDivisionError:
... print("you can not divide by zero")
...
you can not divide by zero
>>> try:
... '2' + 2
... except TypeError:
... print("str can not add int")
...
str can not add int
使用try-else-except,可以提高代码的可执行能力,错误的输出错误信息,加入else代码块可以将成功执行的代码放到else里面成功输出正确的结果
>>> for arg in test:
... try:
... f=6/int(arg)
... except ZeroDivisionError:
... print("you can not divide by zero")
... else:
... print(f)
...
3.0
you can not divide by zero
1.5
6.0