Python 学习第二课
模块与函数
•函数是一段可重用的有名称的代码。将一组代码组织到一起, 实现某种功能。
• 模块是处理某一类问题的集合,模块由函数和类组成。为实 现某种逻辑将相关连的函数写在同一个文件里,使逻辑更清楚,这 就是一个模块。如:在python中文件以.py 结尾,那这个.py文件就 可以称之为模块
• 包是一个完成特定任务的工具箱。包是由关联的多个模块组成 的目录。含有__init__.py文件的目录我们称之为包
函数定义
其基本函数定义如下
•不同于C或java定义,其有关键字‘def’
return 语句可要可不要(看自己需要的返回值是什么)
•python为引用传递
import math
def area(radius):
return math.pi*radius**2
print(area(2.5))
递归函数
不同于迭代,递归为不停的对自身进行运算
缺点:递归程序虽然易读、易编,但需要占用额外的内存空间,并且执 行速度也受影响。
例:计算阶乘函数
def f(n):
if n<=1:
return 1
else:
return n*f(n-1)
print(f(5))
练习
1.编写一个函数isIn,接受两个字符串作为参数,如果一个字符串出现在另一个 字符串中就返回True,否则返回False。提示:你可能需要使用str中的内建操作in, 但也可以不用
def isin(a,b):
if a in b:
return True
else:
return False
a='in'
b='inbox'
just=isin(a,b)
print(just)
2.写函数,接收n个数字,求这些参数数字的和
def sum_all(first,*n):
a=first+sum(n)
return a
b=sum_all(1,2,3,4)
print('这些数字的和是',b)
3.编程求斐波那契序列第n项。斐波那契序列是数字序列,其中每个连续数字是 前两个数字的和。
经典的斐波那契序列开始于 1,1,2,3,5,8,13,……。 编写计算第 n 个斐波纳契数的程序,其中 n是用户输入的值。
例如,如果 n = 6,则结果为 8。
Fibonacci数列定义如下:
1 当n=1时 F(n)= 1 当n>2时 F(n)=F(n-1)+F(n-2)
• 分析:Fibonacci数列的计算具备递归的条件。首先有递推公式F(n)=F(n-1) +F(n-2),第二有结束递归的条件即n=0或n=1时不再递归。
def fibona(n):
if n==1:
return 1
elif n==2:
return 1
else:
return fibona(n-1)+fibona(n-2)
a=fibona(6)
print('第6的一个fibona的值为',a)
模块
• 模块实际上是将一组函数放在一起共享公共的主题;
• 将这些函数存储于一个.py文件中(其中包含用于完成任务的变 量、类和函数,不包括main函数);
• 使用import命令导入。
import circle #或from circle import *
print(circle.pi)#circle为自己写的文件
包
每个包中都有_init_.py文件,用来标识当前的文件夹是一个包
练习汉诺塔问题
• 这是一个古典的数学问题,是一个只能用递归方法解决的问题。
• 问题源于印度一个古老传说,古代有一个梵塔,塔内有三个柱子 A、B、C,开始时A柱上有64个盘子,盘子大小不等,大的在下, 小的在上。想将这64个盘子从A柱移到C柱,但每次只允许移动 一个盘子,且在移动过程中都始终保持大盘在下,小盘在上。在 移动过程中可以利用B柱。
#分治策略
x='a'
y='b'
z='c'
def hanoi(n,a,b,c):
if n==1:
print('把第一个盘子从',a,"移到",c)
else:
hanoi(n-1,a,c,b)
print("把第",n,"个盘子从",a,"移到",c)
hanoi(n-1,b,a,c)
hanoi(3,x,y,z)
解析: 有a,b,c三个柱子,当盘子数只有一个时,径直放到C盘就好 当盘子超过两个时,我们将第一个盘子及倒数第二个看作一个整体,每次处理两个盘子,集将第一部分盘子放到b柱,剩下最后盘子都放到C柱子,最后将b柱上的盘子放到c柱即可,再对最上面的盘子做递归调用即可。
文件操作
•文件分为两类:文本文件和二进制文件。
• Python提供了os、os.path、shutil等模块处理文件。
文件的创建
文件的打开或创建
可以使用函数open。该函数 可以指定处理模式,设置打开的文件为只读、只 写或可读写状态。
•格式:open(file, [mode[, buffering]])—>file object
•参数file是被打开的文件名。若文件file不存在, open()将创建该文件,然后再打开该文件。
•参数mode是指文件的打开模式。打开模式如表1。
•参数buffering设置缓存模式。0表示无缓冲;1表 示行缓冲;如果大于1则表示缓冲区的大小,,- 1(或者任何负数)代表使用默认的缓冲区大小。 以字节为单位。
• open()返回1个file对象,file对象可以对文件进行 各种操作。
file 类
• file类用于文件管理,可以对文件进行创建、打开、读写、关闭 等操作。
• 文件的处理一般分为三个步骤:
• 创建并打开文件,使用open()函数返回1个file对象。
• 调用file对象的read()、write()等方法处理文件。
• 调用close()关闭文件,释放file对象占用的资源。
def make_story():
f=open('story.txt','w')
f.write('marry had a little lamb,\n')
f.write('and then she had some more.\n')
f.close()
def read_story():
f=open('story.txt','r')
for line in f:
print(line)
f.close()
make_story()
read_story()
#添加类容
def add_tostory(line,fname='story.txt'):
f=open(fname,'a')
f.write(line)
f.close()
add_tostory('haha!\n')
def read_story():
f=open('story.txt','r')
for line in f:
print(line)
f.close()
read_story()
文件读取
文件读取有三种方式
按行读取 readline()
多行读取 readlines()
一次性读取 read()
f=open('story.txt')
context=f.read()
print(context)
f.close()
文件写入
文件写入也有多种方式
write()
writelines()
f=open('story.txt','w+')
context=['hello world!\n','hello china!\n']
f.writelines(context)
f.close()
read_story()
字符串插入
def insert_title(title,fname='story.txt'):
f=open(fname,'r+')
temp=f.read()
temp=title+'\n'+temp
f.seek(0)#让文件指针指向开头
f.write(temp)
f.close()
insert_title('long long ago')
read_story()
文件删除与os模块
#文件删除
import os
open('story.txt','w')
if os.path.exists('story.txt'):
os.remove('story.txt')
文件的复制
打开两个文件,分别复制该文件
文件的重命名用os.rename()函数
import os
ls=os.listdir('.')
if 'story.txt' in ls:
os.rename('story.txt','mystory.txt')
总练习
将文件companies.txt 的字符串前加上序号1、2、3、…后写到另 一个文件scompanies.txt中。
def read_one(filename='companies.txt'):
f=open(filename,'r+')
r=f.readlines()
for a in r:
print(a)
f.close()
def duplicate(filename1='companies.txt',filename2='scompanies.txt'):
f1=open(filename1,'r+')
f2=open(filename2,'r+')
r=f1.readlines()
i=1
for line in r:
f2.write(str(i)+'.'+line)
i+=1
f1.close()
f2.close()
def write(filename='companies.txt'):
f=open('companies.txt','w')
context=('GOOGLE INC.\nMicrosoft Corporation\nApple Inc.\nFacebook, Inc')
f.writelines(context)
f.close()
write(filename='companies.txt')
read_one('companies.txt')
duplicate('companies.txt','scompanies.txt')
read_one('scompanies.txt')