python练习(一)

字符串替换

要求

编写一个函数,可以替换字符串内的一个或几个字串。

strreplace(str,oldString,newString)

解答

思路

1.查找
2.切片
3.重装
4.循环至结束

代码

#coding=utf-8
def  strreplace(str,oldString,newString):
    #方法一
    while True :
        position = str.find(oldString)
        if position == -1:
            return str
        str = str[:position] + newString +str[position+len(oldString):]

pstr = "Hello word and worldssp, and world"
a = strreplace(pstr,"world","Tom")
print a

小结

由于return的新字符串和旧字符串起不同的名字,结果在循环时由于各种考虑不周,导致各种死循环,修改后代码拖沓,最后还是取消了新字符串名。

方法二

def  strreplace(str,oldString,newString):
    ns = str.split(oldString)
    return newString.join(ns)

真厉害,我学习的时候还在想join函数有啥用

整理list

要求

将list里的元素[1,2,3,4,5,6,7,8…..100]变成[[1,2,3],[4,5,6],[7,8,9]…..]

解答

思路

1.生成一个新列表
2.取3个数存入新列表
3.将新列表存入新新列表
4.循环

代码

def function(l):
    i=0
    nl=[]
    nnl=[]
    for item in l:
        nl.append(item)
        i+=1
        if i == 3:
            nnl.append(nl)
            i=0
            nl=[]
    nnl.append(nl)
    return nnl
l = [x for x in range(1,101)]
newl=function(l)
print newl

小结

nl,nnl还要先赋个框,不然不允许使用append
看起来好长啊

方法二

def function(l):
    return [l[i:i+3] for i in range(0,len(l),3)]

???
???
???
发生什么了?

输出什么

阅读以下代码,写出输出

def elist(val,list=[]):
    list.append(val)
    return list
list1 = elist(10)
list2 = elist(123,['a','b','c'])
list3 = elist('a')
print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

思路

这个我在错误集锦里看过类似的

解答

list1 = [10]
list2 = [a,b,c,123]
list3 = [10,'a']

应该是这样的,这就是在参数中使用可变类型的后果

答案

list1 = [10, 'a']
list2 = ['a', 'b', 'c', 123]
list3 = [10, 'a']

小结

我的心好痛,忽略了,这不是错误集锦中的一个,而是二合一,list1和3指向同一块地址,3刷新,1也跟着变。

生成随机数

要求

写一个函数,给定参数n,生成含有n个元素值为1~n的数组,元素顺序随机,但值不重复。

解答

思路

random函数不太记得怎么用了
1.生成一个随机数
2.根据是否重复,添加进列表
3.满了,结束

代码

import random
def newrandom(n):
    l=[]
    while True:
        ra=random.randint(1,n)
        if not ra in l:
            l.append(ra)
        if len(l) == n :
            return l
n=10
nl=newrandom(n)
print nl

小结

这回总不能用列表生成式了吧

答案

似乎把判断长度放到上面好一些?
可是放上面会多一次判断啊

查找文件

要求

遍历目录及子目录,抓取带有指定字符串的文件

解答

思路

这个我写过的,还和重命名结合到了一起,虽然以及忘了要调用os里的哪些东西了
1.获取当前目录下的全部文件及文件夹
2.检测
3.对全部文件进行递归操作

代码

#coding=utf-8
import os
def findFile(ls,str):
    for wenjian in os.listdir(ls):
        if str in wenjian:
            print ls +wenjian
        if os.path.isdir(ls+wenjian):
            findFile(ls + wenjian + '/',str)

fi="/home/sky/Desktop/lianxi/"
find="a"
findFile(fi,find)

小结

最开始由于没有判断是否是个文件夹所以导致报错。所以最初只能达成本目录下的搜索。

以前写的

#coding=utf-8
import os 
import os.path
def s(rootdir,oldId,newId):
    #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
    for parent, dirnames, filenames in os.walk(rootdir):
        for filename in filenames:
            if filename.find(oldId)!=-1:
                newName = filename.replace(oldId, newId)
                print filename + "---->" + newName 
                os.rename(os.path.join(parent, filename), os.path.join(parent, newName))
                print os.path.join(parent,newName)
s('/home/sky/Desktop/lianxi', 'da','asd')

虽然使用了walk函数使其不用递归。但是感觉还是递归短啊。
实际应用了一次,递归的因为没有文件夹打开权限翻车了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值