前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python入门-3

python入门-3

作者头像
王诗翔呀
发布2020-11-13 10:47:36
1.2K0
发布2020-11-13 10:47:36
举报
文章被收录于专栏:优雅R

函数

带名字的代码块,用来完成具体的工作。

函数的结构

函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

创建一个简单的hello函数

代码语言:javascript
复制
>>> def hello():
...     print('hello,world')
...
>>> hello()
hello,world
参数

定义函数时()里面的参数是形参,输入的值为实参,下面的列子中hello(x)为形参,7为实参

代码语言:javascript
复制
>>> def hello(x):
...     return x
>>> hello(7)
7
默认值

我们可以在参数里面定义自己的默认值

代码语言:javascript
复制
>>> def hello(x,y):
...     return x-y
...
>>> hello(3,7)
-4
返回值

函数返回的值为返回值

代码语言:javascript
复制
>>> def hello(x):
...     return x*3
...
>>> hello(3)
9

如果传入的不是不可修改的对象比如传入的是个整数或者浮点数,函数里面虽然修改了值,但是不会改变原始对象。

如果传入的十个列表,函数里面引用的就还是这个列表,函数改变,原始变量也会改变

代码语言:javascript
复制
>>> def hello(x):
...     x=2
...
>>> x=3
>>> print(x)
3
>>> hello(x)
>>> print(x)
3            

我们可以发现x并没有变为2

代码语言:javascript
复制
>>> def hello(x):
...     x[1]=2
>>> x=[2,4,6]
>>> hello(x)
>>> print(x)
[2, 2, 6]

可以看到x执行这个函数后改变了里面的值

返回字典

代码语言:javascript
复制
>>>def person(name,score):
    person= {'name':name,'score':score}
    return person
>>>person("Tom",90)
{'name': 'Tom', 'score': 90}

函数里面嵌套函数

下面的举例是函数里面嵌套函数,返回值返回的是个function,里面的x都是fun这个函数的参数x

代码语言:javascript
复制
>>>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

结合使用函数和while循环

代码语言:javascript
复制
>>>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

传递列表

我们可以在函数中加入循环传递列表的内容

代码语言:javascript
复制
>>> def hello(x):
...     for name in x:
...         print('hello'+name+'!')
...
>>> t=['tom','mary','hh']
>>> hello(t)
hellotom!
hellomary!
hellohh!

传递任意数量的实参

在形参中加入*,表示可以传入不止一个实参

代码语言:javascript
复制
>>> def vegetable(*x):
...     print(x)
...
>>> vegetable('spinage')
('spinage',)
>>> vegetable('spinage','chinese leaf')
('spinage', 'chinese leaf')

函数式编程

就是用函数来表示程序,用函数的组合表达程序组合的思维方式

lambda

python允许使用lambda关键字来创建匿名函数,下面通过例子来解释什么时lambda函数

代码语言:javascript
复制
####先简单定义一个函数
>>>
>>> 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是一个过滤器它的作用是在海量的数据里面提取出有用的信息,filter里面有两个参数,一个参数里面可以是函数,也可以是None,如果是一个函数的话,可以将第二个可迭代对象里的每个元素作为函数的参数进行计算,把返回TRUE的值计算出来,只返回TRUE的值。

代码语言:javascript
复制
>>> 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()

map 是个映射函数,参数仍然是一个是函数,另一个是可迭代对象,支持多个可迭代对象,返回计算的结果。

代码语言:javascript
复制
>>> 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中,字典是一系列的键值对,每个键都与一个值相关联,可以用键来访问对应的值,与键相对应的可以是数字,字符串,列表乃至字典。

如果想要把一个班级的同学的姓名成绩保存在一个列表中,可以使用列表加元组的方式

代码语言:javascript
复制
data=[('tom',89),('mary',90),('haha',100)]
data
代码语言:javascript
复制
[('tom', 89), ('mary', 90), ('haha', 100)]

对于上面的列表如果我们想要查询列表里面有没有tom这个同学,就需要对列表里面的所有进行比较,会比较慢,所以想要根据某个特征查询所对应的值,就是字典的形式。由key_value构成的键值对,数据结构里面叫map,python里面就是字典

下面我们创建一个字典

代码语言:javascript
复制
scores={'tom':90,'mary':80,'mike':70,'jak':100}
scores
代码语言:javascript
复制
{'tom': 90, 'mary': 80, 'mike': 70, 'jak': 100}
代码语言:javascript
复制
len(scores)### 查看有多少个键值对
代码语言:javascript
复制
4

使用字典

代码语言:javascript
复制
scores['tom'] ###根据键tom得到对应的值90
代码语言:javascript
复制
90
代码语言:javascript
复制
scores.get('tom')
代码语言:javascript
复制
90
代码语言:javascript
复制
scores['bob']=88 ###字典里添加键值对
代码语言:javascript
复制
scores
代码语言:javascript
复制
{'tom': 90, 'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}
代码语言:javascript
复制
scores['tom']='toom' ###修改字典中的值
scores
代码语言:javascript
复制
{'tom': 'toom', 'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}
代码语言:javascript
复制
del scores['tom'] ####删除键值对
scores
代码语言:javascript
复制
{'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}

遍历字典

代码语言:javascript
复制
scores
代码语言:javascript
复制
{'mary': 80, 'mike': 70, 'jak': 100, 'bob': 88}
代码语言:javascript
复制
for key,value in scores.items(): ###遍历所有的键值对
    print(key)
    print(value)
代码语言:javascript
复制
mary
80
mike
70
jak
100
bob
88
代码语言:javascript
复制
for name in scores.keys(): #####遍历所有的键
    print(name)
代码语言:javascript
复制
mary
mike
jak
bob
代码语言:javascript
复制
for score in scores.values(): ####遍历所有的值
    print(score)
代码语言:javascript
复制
80
70
100
88
代码语言:javascript
复制
scoresheet={'mike':(60,80,90),'tom':(80,70,99),'mary':(78,90,57)}
for key in scoresheet.keys():
    print(key,scoresheet[key])
代码语言:javascript
复制
mike (60, 80, 90)
tom (80, 70, 99)
mary (78, 90, 57)

字典列表

将字典包含在列表中

代码语言:javascript
复制
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
代码语言:javascript
复制
[{'hh': 1, 'hhw': 2, 'hhh': 3},
 {'yy': 1, 'yyy': 2, 'yyyy': 3},
 {'uu': 1, 'uuu': 2, 'uuuu': 3}]
代码语言:javascript
复制
for alien in alionall:
    print(alien)
代码语言:javascript
复制
{'hh': 1, 'hhw': 2, 'hhh': 3}
{'yy': 1, 'yyy': 2, 'yyyy': 3}
{'uu': 1, 'uuu': 2, 'uuuu': 3}
代码语言:javascript
复制
for alien in alionall[:2]:
    print(alien)
代码语言:javascript
复制
{'hh': 1, 'hhw': 2, 'hhh': 3}
{'yy': 1, 'yyy': 2, 'yyyy': 3}

在字典中储存列表

代码语言:javascript
复制
apple={'color':['red','yellow'],
      'shape':['round','square']}
代码语言:javascript
复制
for things in apple.values():
    print(things)
代码语言:javascript
复制
['red', 'yellow']
['round', 'square']
代码语言:javascript
复制
for key in apple.keys():
    print(key)
代码语言:javascript
复制
color
shape

在字典中包含字典

代码语言:javascript
复制
people={'tom':{'math':80,'english':90},
       'mary':{'math':90,'english':70}}
for name,project in people.items():
    print(name,project)
代码语言:javascript
复制
tom {'math': 80, 'english': 90}
mary {'math': 90, 'english': 70}
代码语言:javascript
复制
for name,pro in people.items():
    print(name,pro)
代码语言:javascript
复制
tom {'math': 80, 'english': 90}
mary {'math': 90, 'english': 70}

字典的表亲:集合

创建集合

两种创建方式,一种是直接创建,另一种用set创建。

代码语言:javascript
复制
>>> name={"tom","yamy","mary","kai"}
>>> name2=set(["tom","yamy","mary","kai"])
>>> name==name2
True

访问集合

集合中的元素是无序的,不能像序列那样用下表的方式来进行访问,但是可以使用迭代的方式把集合中的数据一个个读取出来。

代码语言:javascript
复制
>>> for na in name:
...  print(na)
...
kai
tom
mary
yamy

添加删除集合内容

代码语言:javascript
复制
>>> name.add("haha")
>>> name
{'tom', 'haha', 'kai', 'mary', 'yamy'}
>>> name.remove('haha')
>>> name
{'tom', 'kai', 'mary', 'yamy'}

不可变集合

用函数frozenset将集合冰冻起来,那么集合就会变成不可变的形式,不能修改。

代码语言:javascript
复制
>>> 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编程入门到实践 python使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

代码语言:javascript
复制
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需要用反斜杠\

代码语言:javascript
复制
>>> 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循环

代码语言:javascript
复制
>>> with open('test.txt') as file:
...     for line in file:
...         print (line)
...
abcdehcb

bsudiabjs

bcshcuyb

bshcbaknca

我们发现逐行打印的文件空表行却增加了,是因为在文件的末尾都会有一个看不见的换行符,而print语句也会加上一个换行符,因此打印出来的都会有两个换行符,消除换行符可以使用rstrip()

代码语言:javascript
复制
>>> with open('test.txt') as file:
...     for line in file:
...         print (line.rstrip())
...
abcdehcb
bsudiabjs
bcshcuyb
bshcbaknca

附加到文件

如果要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件,附加模式打开文件时python不会清空原有的文件内容,写入的新的文件内容会添加到末尾

代码语言:javascript
复制
>>> 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

写入空文件

代码语言:javascript
复制
>>>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.'

写入多行

代码语言:javascript
复制
>>>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程序 我们在编写程序的时候会出现两类错误:语法错误、语义错误。 Python的语法错误或者称之为解析错,是初学者经常碰到的,如下实例

代码语言:javascript
复制
>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax
这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号 : 。
语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。

python异常:每当让python发生不知所措的错误时,他会创建一个异常对象,如果编写代码时没有编写处理该异常的代码,那么程序会停止,并且显示traceback,其中包含有关异常的报告。

例子
代码语言:javascript
复制
>>> 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 代码块指出异常,可以在可能出现异常的地方设置代码提示自己出现了什么样的异常,怎么改正

代码语言:javascript
复制
>>> 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里面成功输出正确的结果

代码语言:javascript
复制
>>> 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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数
    • 函数的结构
      • 参数
      • 默认值
      • 返回值
    • 结合使用函数和while循环
      • 传递列表
        • 传递任意数量的实参
          • 函数式编程
            • lambda
            • filter()
            • map()
        • 字典
          • 使用字典
            • 遍历字典
              • 字典列表
              • 字典的表亲:集合
                • 创建集合
                  • 访问集合
                    • 添加删除集合内容
                      • 不可变集合
                      • python 文件处理
                        • 打开文件并且显示文件内容
                          • 逐行读取文件
                            • 附加到文件
                              • 写入空文件
                                • 写入多行
                                • Python 异常处理
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档