python 学习笔记day02-python循环、文件、函数、模块

循环语句

while 循环

while 循环语法结构

当需要语句不断的重复执行时,可以使用 while 循环

while expression:

while_sutie

语句 while_suite 会被连续不断的循环执行,直到表达式的值变成 0 或 False

        #!/usr/bin/env python
        # -- coding: utf-8 --
        sum100 = 0
        counter = 1
        while counter <=100:
            sum100 +=counter
            counter +=1
        print "result is: %d " % sum100

break 语句

break 语句可以结束当前循环然后跳转到下条语句

写程序时,应尽量避免重复的代码,在这种情况下可以使用 while-break 结构

         name = raw_input(‘username: ‘)
         while name != ‘tom‘:
             name = raw_input("username: ")

可以替换为

while Ture:
            name = raw_input("username: ")
            if name == ‘tom‘
                break
        
        #!/usr/bin/env python
        # --coding: utf-8 --

        while True:
            yn = raw_input("Continue(Y/N)? ")
            # break 作用:当 yn 在 yY 中则跳出 while 循环,即不再执行 print
            if yn in ‘yY‘:
                break
            print ‘working....‘

continue 语句

当遇到continue语句时,程序会终止当前循环,并忽略剩余的语句,然后回到循环的顶端

如果仍然满足循环条件,循环提内语句继续执行,否则退出循环

        #!/usr/bin/env python
        # --coding: utf-8 --

        sum100 = 0
        counter = 1
        while counter <= 100:
            counter += 1
            if counter % 2:
                continue
            sum100 += counter
        print "result is: %d " % sum100

else 语句

python 中的 while 语句也支持else子句

else子句只在循环完成后执行

break语句也会跳过else块

        #!/usr/bin/env python
        # --coding: utf-8 --

        sum10 = 0
        i = 1
        while i <=10:
            sum10 +=1
        else:
            print sum10
插曲:

>>> import webbrowser
>>> help(webbrowser)

>>> webbrowser.open_new_tab("http://www.baidu.com")   #可以打开一个新的网页 
True
>>> webbrowser.open_new_tab("http://192.168.2.100")   # 同上。 
True

>>> import os
>>> os.system(‘ls /home/qihang/‘)

刷博客的循环(初级模式)
#!/usr/bin/env python
# --coding: utf-8 --

import webbrowser
import time
import os
url = "http://192.168.1.107"
counter = 0

while counter < 11:
    webbrowser.open_new_tab(url)
    time.sleep(0.5) #睡0.5秒
    counter +=1
    if not counter % 10:
       os.system(‘killall firefox‘)

for 循环

for 循环语法结构

python中的for接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素

for iten_var in iterable:

suite_expression

>>> for ch in ‘abcd‘:
                ...     print ch
                ...
                a
                b
                c
                d
                >>> for ch in ["hello","wold"]:
                ...     print ch
                ...
                hello
                wold

与while循环一样,支持break/continue/else 语句

一般情况下,循环次数未知采用 while 循环,循环次数已知,采用 for 循环

range 函数

for循环常与range函数一起使用

range函数提供循环条件

range函数的完整语法为:

range(start,end,step=1)

>>> range(5)
                    [0, 1, 2, 3, 4]
                    >>> range(1,5)
                    [1, 2, 3, 4]
                    >>> range(1,5,2)
                    [1, 3]

>>> range(10,0,-1)

>>> for i in range(3):
                    ...   print "hello world!"
                    ...
                    hello world!
                    hello world!
                    hello world!
                    >>> alist = [‘bob‘,‘alict‘,‘tom‘,‘jerry‘]
                    >>> for i in range(len(alist)):
                    ...   print "%s: %s" %(i,alist[i])
                    ...
                    0: bob
                    1: alict
                    2: tom
                    3: jerry

xrange 函数

xrange()类似range(),不过当你有一个很大的范围列表时,xrange()可以更为适合,因为它不会在内存里创建列表的完整拷贝。

它只被用在for循环中,在for循环外使用它没有意义

它的性能远高出range(),因为它不生成整个列表

>>> for x in xrange(3):
                ...   print x
                ...
                0
                1
                2
注意:print x 后面 加“,”,可以不用换行。
斐波那契数列

1、斐波那契数列就是某一个数,总是前两个数之和,比如0,1,1,2,3,5,8

2、使用for循环和range()函数编写一个程序,加算有10个数的斐波那契数列

3、改进程序,要求用户输入一个数字,可以生成用户需要长度的斐波那契数列

        #!/usr/bin/env python        # --coding: utf-8 --        num = int(raw_input("number")        fib = [0,1]        for i in range(num - 2):            fib.append(fib[-1] + fib[-2])        print fib        一个小练习,使用python来ping 一个网段的主机存活        #!/usr/bin/env python

        import os

        for i in range(1,255):            ip = "192.168.1.%s" % i            result = os.system("ping -c2 %s > /dev/null" % ip)            if result:                print "%s: down" %ip            else:                print "%s:up" %ip

列表解析

它是一个非常有用、简单、而且灵活的工具,可以用来动态地创建列表

语法:

[expr for iter_var in iterable]

>>> [‘hello‘ for i in range(2)]
                     [‘hello‘, ‘hello‘]

>>> [i for i in range(1,10)]
                    [1, 2, 3, 4, 5, 6, 7, 8, 9]
                    >>> [i ** 2 for i in range(1,10)]
                    [1, 4, 9, 16, 25, 36, 49, 64, 81]

这个语句的核心是for循环,它迭代iterable对象的所有条目

expr 应用与序列的每个成员,最后的结果是该表达式产生的列表

文件对象

文件打开方法

open及file 内建函数

作为打开文件之门的“钥匙”,内建函数open()以及file()提供了初始化输入/输出(I/O)操作的通用接口

成功打开文件后会返回一个文件对象,否则引发一个错误

open()方法和file()方法可以完全相互替换

基本语法:

file_object = open(file_name,access_mode=‘r‘,buffering=-1)

>>> f = open(‘/etc/hosts‘)
                >>> f
                <open file ‘/etc/hosts‘, mode ‘r‘ at 0xb744e0d0>
                >>> f.read()
                ‘127.0.0.1\tlocalhost\n127.0.1.1\tqihang-Lenovo-G460\n\n# The following lines are desirable for IPv6 capable hosts\n::1     ip6-localhost ip6-loopback\nfe00::0 ip6-localnet\nff00::0 ip6-mcastprefix\nff02::1 ip6-allnodes\nff02::2 ip6-allrouters\n‘

>>> f.close()
                >>> f = open(‘/etc/hosts‘)
                >>> data = f.read()
                >>> print data,
                127.0.0.1    localhost
                127.0.1.1    qihang-Lenovo-G460

# The following lines are desirable for IPv6 capable hosts
                ::1     ip6-localhost ip6-loopback
                fe00::0 ip6-localnet
                ff00::0 ip6-mcastprefix
                ff02::1 ip6-allnodes
                ff02::2 ip6-allrouters
                >>> f.close()

文件对象的访问模式:

文件模式 操作

r

以读方式打开(文件不存在则报错))
w 以写方式打开(文件存在则清空,不存在则创建)
a 以追加模式打开(必要时创建新文件)
r+ 以读写模式打开(参见r)
w+ 以读写模式打开(参见w)
a+ 以读写模式打开(参见a)

文件输入

read方法

read()方法用来直接读取字节到字符串中,最多读取给定数目个字节

如果没有给定size参数(默认值为-1)或者size值为负,文件将被读取直至末尾

>>> data = fobj.read()

>>> print data

readline 方法

>>> f = open(‘/etc/hosts‘)
                >>> f.readline()
                ‘127.0.0.1\tlocalhost\n‘
                >>> f.readline()
                ‘127.0.1.1\tqihang-Lenovo-G460\n‘

>>> f.close()

readlines 方法

>>> f = open(‘/etc/hosts‘)
               >>> f.readlines()
               [‘127.0.0.1\tlocalhost\n‘, ‘127.0.1.1\tqihang-Lenovo-G460\n‘, ‘\n‘, ‘# The following lines are desirable for IPv6 capable hosts\n‘, ‘::1     ip6-localhost ip6-loopback\n‘, ‘fe00::0 ip6-localnet\n‘, ‘ff00::0 ip6-mcastprefix\n‘, ‘ff02::1 ip6-allnodes\n‘, ‘ff02::2 ip6-allrouters\n‘]

>>> f.close()

文件迭代

如果需要逐行处理文件,可以结合 for 循环迭代文件

迭代文件的方法与处理其他序列类型的数据类似

>>> fobj = open("star.py")

>>> for eachLine in fobj:

...    print eachLine,

>>> f = open("/etc/hosts")
                >>> for line in f:
                ...   print line,
                ...
                127.0.0.1    localhost
                127.0.1.1    qihang-Lenovo-G460

# The following lines are desirable for IPv6 capable hosts
                ::1     ip6-localhost ip6-loopback
                fe00::0 ip6-localnet
                ff00::0 ip6-mcastprefix
                ff02::1 ip6-allnodes
                ff02::2 ip6-allrouters
                >>> f.close()

文件输出

write 方法

write()内建方法功能与read()和readline()相反。它把含有文本数据或二进制数据块的字符串写入到文件中去

写入文件时,不会自动添加行结束标志,需要程序员首手工输入

>>> fobj.write("Hello World!\n")

>>> f = open(‘hi.txt‘,‘w‘)
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: File not open for reading
>>> f.write(30)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a character buffer object
>>> f.write(‘hello world!‘)    # f.write(‘hello world!\n‘)  加上\n 换行
>>> f.flush()
>>> exit()

>>> f  =open(‘hi.txt‘,‘a‘)
>>> f.write(‘new line.\n‘)
>>> f.close()
>>> exit()

writelines 方法()列表方式)

>>> f.writelines([‘2rd lines\n‘,‘3rd lines\n‘])

>>> f.flush()

>>> f.close()

练习:模拟cp操作

1、创建~/bin/cp.py文件

2、将/bin/ls "拷贝"到/root目录下

3、要求读取/bin/ls 后,每次读取4096字节,依次写入到新文件

4、不要修改原始文件

#!/usr/bin/env python
# coding: utf-8 --

sfname = ‘/bin/ls‘
dfname = ‘/root/ls‘

src_fobj = open(sfname)
dst_fobj = open(dfname,‘w‘)

while True:
    data = src_fobj.read(4096)
    if not data:
        break
    dst_fobj.write(data)
src_fobj.close()
dst_fobj.close()

比对md5值,检查文件是否完全相同,检查结果为相同。

小插曲:read文件的时候会直接占用内存个

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1941       1713        227         30         56        283
-/+ buffers/cache:       1372        568
Swap:         1972        513       1459

# dd if=/dev/zero of=ttt.img bs=1M count=100

>>> f = open(‘ttt.img‘)
>>> data = f.read()

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1941       1812        128         30         56        281
-/+ buffers/cache:       1474        466
Swap:         1972        513       1459
>>> f.close()
>>> del data

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1941       1722        218         30         56        281
-/+ buffers/cache:       1384        556
Swap:         1972        513       1459

函数

函数基本操作

函数基本概念

函数是对程序逻辑进行结构化或过程化的一种编程方法

将整块代码巧妙地隔离成易于管理的小块

把重复代码放到函数中而不是进行大量的拷贝,这样既能节省空间,也有助于保持一致性

通常函数都是用于实现某一种功能

创建函数

函数是用def语句来创建的,语法如下:

def function_name(arguments):

"function_documentation_string"

function_body_stuite

#!/usr/bin/env python
# --coding: utf-8 --
#define function
def pstar():
    print ‘*‘ * 20
    print "#" * 20
# use function
pstar()
prstar()

标题行由def关键字,函数的名字,以及参数的集合(如果有的话)组成

def子句的剩余部分包括了一个虽然可选但是强烈推荐的文档字符串,和必须的函数体

调用函数

同大多数语言相同,python用一对圆括号调用函数

如果没有加圆括号,只是对函数的引用

>>> def foo():

...  print "hello"

...

>>> foo()

hello

>>> foo

<function foo at 0x7ff2328967d0>     # 函数在内存中的地址。

函数的返回值

多数情况下,函数并不直接输出数据,而是向调用者返回值

函数的返回值使用return关键字

没有return的话,函数默认使用None

>>> def foo():

...    res = 3 + 4

>>> i = foo()

>>> print i

None

函数参数

定义参数

形式参数

- 函数定义时,紧跟在函数名后(圆括号内)的参数被称为形式参数,简称形参,由于它不是实际存在变量,所以又称虚拟变量

#!/usr/bin/env python

def pstar(num):

return ‘*‘ * num

n = int(raw_input("number: "))

print pstar(n)

实际参数

- 在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”,简称实参

传递参数

调用函数时 ,实参的个数需要与形参个数一致

实参将依次传递给形参

>>> def foo(x,y):
                ...    print ‘x=%d,y=%d‘ %(x,y)
                ...
                >>> foo()
                Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                TypeError: foo() takes exactly 2 arguments (0 given)
                >>> foo(3)
                Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                TypeError: foo() takes exactly 2 arguments (1 given)
                >>> foo(3,4)
                x=3,y=4

位置参数

与shell脚本类似,程序名以及参数都以位置参数的方式传递给python  程序

使用sys模块的argv列表接收

$ vim args.py
#!/usr/bin/env python
import sys
print sys.argv

$ python args.py hello world
            [‘args.py‘, ‘hello‘, ‘world‘]

#!/usr/bin/env python
# coding: utf-8 --
import sys

def cp(sfname,dfname):

src_fobj = open(sfname)
    dst_fobj = open(dfname,‘w‘)

while True:
        data = src_fobj.read(4096)
        if not data:
            break
        dst_fobj.write(data)
    src_fobj.close()
    dst_fobj.close()

cp(sys.argv[1],sys.argv[2])

默认参数

默认参数就是声明了默认值的参数

因为给参数赋予了默认值,所以在函数调用时,不向该参数传入值也是允许的

>>> def pstar(num = 30):
                    ...   print "*" * num
                    ...
                    >>> pstar()
                    ******************************
                    >>> pstar(40)
                    ****************************************
将cp 编程函数形式:

#!/usr/bin/env python
# coding: utf-8 --

def cp(sfname,dfname):

src_fobj = open(sfname)
    dst_fobj = open(dfname,‘w‘)

while True:
        data = src_fobj.read(4096)
        if not data:
            break
        dst_fobj.write(data)
    src_fobj.close()
    dst_fobj.close()
cp(‘/bin/ls‘,‘/home/list‘)
cp(‘/bin/touch‘,‘/home/mytouch‘)

模块

定义模块

模块基本概念

模块是从逻辑上组织python代码的形式

当代码量变得相当大的时候,最好把代码分成一些有组织的代码段,前提是保证它们的彼此交互

这些代码片段相互间有一定的联系,可能是一个包含数据成员和方法的类,也可能是一组相关但彼此独立的操作函数

创建模块

模块物理层面上组织模块的方法十文件,每一个以.py作为极为的python文件都是一个模块

模块名称切记不要与系统中已存在的模块重名

模块文件名字去掉后面的扩展名(.py)即为模块名

使用模块

导入模块(import)

使用import导入模块

模块被导入后,程序会自动生成pyc的字节码文件以提升性能

模块属性通过“模块名.属性”的方法调用

如果仅需要模块中的某些属性,也可以单独导入

>>> import tab
                     >>> import sys
                     >>> import os,string
                    >>> string.digits
                    ‘0123456789‘
                    >>> from random import randint    #导入模块中的某个方法
                    >>> randint(1,10)
                    3
                    >>> import random as rdm   #导入random 模块并加别名 rdm

模块加载(load)

一个模块只被加载一次,无论它被导入多少次

只加载一次可以阻止多重导入时代码被多次执行

如果两个文件相互导入,阻止了无限的相互加载

模块加载时,顶层代码会自动执行,所以只将函数放入模块的顶层是良好的编程习惯

模块导入的特性

模块具有一个__name__特殊属性

当模块文件直接执行时,__name__的值为‘__main__‘

当模块被另一个文件导入时,__name__的值就是该模块的名字

$ cat foo.py
#!/usr/bin/env python
print __name__

$ cat bar.py
#!/usr/bin/env python
import foo
$ python foo.py
__main__
$ python bar.py
foo

__name__ 是python 的内部变量,在foo 中 打印 __name__ ,单独执行时,输出的名字是__main__,被其他程序导入后,显示foo。

一个模块文件自己独立执行的时候,__name__,打印的是__main__,如果是被其他文件导入了。则__name__打印的就是模块名

应用:

#vim star.py

#!/usr/bin/env python

def pstar(num=20):

return ‘*‘ * num

if __name__ == ‘__main__‘:

print pstar()

print pstart(40)

上述代码,单独执行(python star.py) ,则会执行 print pstar() print pstar(),如果import star,则不会执行print pstar() print pstar()

练习:生成8位随机密码

1、编写一个能生成8位随机密码的程序

2、使用random的choice函数随机取出字符

3、用于密码的字符通过string模块获得

4、改进程序,用户可以自己决定生成多少位的密码

多线程 ping

mtping.py

#!/usr/bin/env python

import os

import threading
def ping(ip):
    result = os.system("ping -c2 %s > /dev/null" % ip )
    if not result:
        print "%s:up" % ip
    else:
        print "%s:down" % ip

if __name__ == ‘__main__‘:
    for i in range(1,255):
        ipaddress = "192.168.2.%s" % i
        t = threading.Thread(target=ping,args=[ipaddr])
        t.start()

时间: 2024-10-05 23:50:38

python 学习笔记day02-python循环、文件、函数、模块的相关文章

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

python 学习笔记 7 -- Python关键字总结

0.写在前面的话 学习一门语言最重要的功课是练习与复习,在<笨方法学Python>中第三十七节虽然没有教你任何内容,但是它提醒我们:"学了这么多,你还能记得多少?该复习了!" 下面我们就对这一节的第一部分"关键字"来做个复习: Python中的关键字包括如下: and       del        from      not      while    as        elif       global    or       with     

python 学习笔记 13 -- 经常使用的时间模块之time

Python 没有包括相应日期和时间的内置类型.只是提供了3个相应的模块,能够採用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包括一些函数用于获取时钟时间和处理器的执行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口. datetime 中的类支持算术.比較和时区配置. *    calendar 模块能够创建周.月和年的格式化表示. 它还能够用来计算反复事件.给定日期是星期几,以及其

Python学习笔记__2.2章 定义函数

# 这是学习廖雪峰老师python教程的学习笔记 1.定义函数 定义一个函数需要有函数名.参数.函数体.函数体中最好还有 传入的参数判断 1.1.函数创建 定义一个函数用def,数据类型检查用isinstance.例子如下: def my_abs(x): if not isinstance(x, (int, float)):    # 判断传入的参数,是否是 ××× 或 浮点形 raise TypeError('bad operand type')  #  抛出错误 if x >= 0: ret

Python学习笔记__4.2章 返回函数

# 这是学习廖雪峰老师python教程的学习笔记 1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. # 累加函数 def external(*args): def internal(): ax = 0 for n in args: ax = ax + n return ax return internal  # external的返回值是internal # 调用external() f = external(1, 3, 5, 7, 9)   #这里的 f是一

Python学习笔记__4.3章 匿名函数(简洁函数)

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 关键字lambda表示匿名函数 list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) # 列表生成式中的 lambda 实际就是 def f(x): return x * x 但匿名函数有个限制,就是只能有一个表达式. 匿名函数不用写return,返回值就是该表达式的结果 匿名函数因为函数没有名字,不必担心函数名冲突. 此外,匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量

Python学习笔记2—Python语句(顺序、选择、循环)

一.Python语句 python语句大体上分为:顺序执行语句,条件执行语句,循环执行语句. 语句逐个运行 Python 从头到尾执行文件中的嵌套块中的语句 块和语句的边界自动检测 Python 没有 或者\ begin/end" 等分割字符 Python 使用首行下的语句缩进把嵌套块内的语句组合起来,没有分号结束,一行的末尾通常是语句的结尾 复合语句,首行 +":"+ 缩进语句 Python 中复合语句都遵循相同的格式,首行会以冒号终止,再接一个或者多个嵌套语句,通常都是在

python学习笔记(一):python简介和入门

最近重新开始学习python,之前也自学过一段时间python,对python还算有点了解,本次重新认识python,也算当写一个小小的教程.一.什么是python?python是一种面向对象.解释型的计算机语言,它的特点是语法简洁.优雅.简单易学.在1989诞生,Guido(龟叔)开发.这里的python并不是蟒蛇的意思,而是龟叔非常喜欢一部叫做<Monty Python飞行马戏团>的电视剧,所以以python命名(老外就是这么任性).二.解释型语言和编译型语言编译型语言就是先把写好的程序翻

python学习笔记(python发展介绍)

一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum) 目前python主要应用领域: ·云计算 ·WEB开发 ·科学运算.人工智能 ·系统运维 ·金融:量化交易,金融分析等,作为动态语言的python,语言结构清晰简单,库丰富,成熟稳定,科学计算和统计分析都很牛 ·图形GUI python是一门什么样的语言? 编程语言主要从以下几个角度进行分类,编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言. 编译型和解释型 编译型,如:c,c++,

python学习笔记(十一)-python程序目录工程化

在一个程序当中,一般都会包含文件夹:bin.conf.lib.data.logs,以及readme文件. 所写程序存放到各自的文件夹中,如何进行串联? 首先,通过导入文件导入模块方式,引用其他人写好的代码. 其次,找到最顶层的程序所在文件夹,加入到环境变量中 import sys,os BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(file))) #取到工程目录 sys.path.insert(0,BASE_PATH)#加