Python 学习第二课

本文介绍了Python编程中的模块、函数、递归和文件操作。详细讲解了如何定义和使用函数,递归函数的原理与实现,以及模块和包的概念。同时,通过实例演示了文件的打开、读写、删除和复制操作。最后,通过汉诺塔问题展示了递归在解决问题中的应用。
摘要由CSDN通过智能技术生成

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')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值