Python函数中的变量和文件

时间:2018-07-16 14:46:14   来源:上海尚学堂   阅读:

一、Python函数和变量

函数这个概念也许承载了太多的信息量,不过别担心。只要勤加练习,对照《养成这8个编程习惯,你的Python性能将蹭蹭蹭地往上涨》中的检查点检查一遍这次的联系,你最终会明白这些内容的。


 
有一个你可能没有注意到的细节,我们现在强调一下:函数里边的变量和脚本里边的变量之间是没有连接的。下面的这个练习可以让你对这一点有更多的思考:
 
def cheese_and_crackers(cheese_count, boxes_of_crackers):
      print "You have %d cheeses!" % cheese_count
      print "You have %d boxes of crackers!" % boxes_of_crackers
      print "Man that's enough for a party!"
      print "Get a blanket.\n"
      print "We can just give the function numbers directly:"
cheese_and_crackers(20, 30)
print "OR, we can use variables from our script:"
amount_of_cheese = 10
amount_of_crackers = 50
cheese_and_crackers(amount_of_cheese, amount_of_crackers)
print "We can even do math inside too:"
cheese_and_crackers(10 + 20, 5 + 6)
print "And we can combine the two, variables and math:"
cheese_and_crackers(amount_of_cheese + 100, amount_of_crackers + 1000)

通过这个练习,你看到我们给我们的函数  cheese_and_crackers  很多的参数,然后在函数里把它们打印出来。我们可以在函数里用变量名,我们可以在函数里做运算,我们甚至可以将变量和运算结合起来。
 
从一方面来说,函数的参数和我们的生成变量时用的  =  赋值符类似。事实上,如果一个物件你可以用  =将其命名,你通常也可以将其作为参数传递给一个函数。
 

你应该看到的结果

你应该研究一下脚本的输出,和你想象的结果对比一下看有什么不同。
$ python ex19.py
We can just give the function numbers directly:
You have 20 cheeses!
You have 30 boxes of crackers!
Man that's enough for a party!
Get a blanket.
OR, we can use variables from our script:
You have 10 cheeses!
You have 50 boxes of crackers!
Man that's enough for a party!
Get a blanket.
We can even do math inside too:
You have 30 cheeses!
You have 11 boxes of crackers!
Man that's enough for a party!
Get a blanket.
And we can combine the two, variables and math:
You have 110 cheeses!
You have 1050 boxes of crackers!
Man that's enough for a party!
Get a blanket.
$
 

加分习题

1. 倒着将脚本读完,在每一行上面添加一行注解,说明这行的作用。
2. 从最后一行开始,倒着阅读每一行,读出所有的重要字符来。
3. 自己编至少一个函数出来,然后用 10 种方法运行这个函数。
 

常见问题和回 答

1、怎么能有  10  种不同的方式运行一个函数呢?
信不信由你,理论上有无穷多种方法运行一个函数。在这里,试着按我在  8-12  行的方式运行,当然你可以随意创新。
 
2、有没有办法可以分析这个函数的功能以便我理解?
有很多方法,最简单的一个是在每一行代码上面添加注解,另外一个方法是大声朗读代码,还有一个方法就是把代码打印出来,用笔画一些图示,并写一些注解说明。
 
3、怎样处理用户输入的数字,例如我想让用户输入克力架和奶酪的数量?
记住使用  int()  把  raw_input()  的值转为整数。
 
4、第  13  和  14  行创建的变量会不会改变函数中的变量?
不会。这些变量是在函数之外的,当它们被传递到函数中以后,函数会为这些变量创建一些临时的版本,当函数运行结束后,这些临时变量就被丢弃了,一切又回到了从前。继续阅读本书,后面你会更清楚这些概念。
 
5、把全局变量(如  13 、 14  行)的名称和函数变量的名称取成一样的,这样做是不是不好?
是的,因为这样的话你就无法确定哪个是哪个了。有时候你可能会必须使用同一个变量名,有时候你会不小心使用了一样的变量名,不论如何,只要有可能,还是尽量避免变量名称相同吧。
 
6、第 12-19  行是不是覆写了函数  cheese_and_crackers?
没有,完全没有。这只是函数调用而已。基本上就是这里会跳转到函数的第一行,然后等函数运行完后再回到先前的位置。并没有把原函数怎么地。
 
7、函数的参数个数有限制吗?

取决于  Python  的版本和你的操作系统,不过就算有限,限值也是很大的。实际应用中, 5  个参数
就不少了,再多就会让人头疼了。

8、可以在函数中调用函数吗?
可以。后面的习题中你会用这一技巧写一个游戏。

 

二、Python 函数和文件

回忆一下函数的要点,然后一边做这节练习,一边注意一下函数和文件是如何在一起协作发挥作用的。
 
from sys import argv
script, input_file = argv
def print_all(f):
print f.read()
def rewind(f):
f.seek(0)
def print_a_line(line_count, f):
print line_count, f.readline()
current_file = open(input_file)
print "First let's print the whole file:\n"
print_all(current_file)
print "Now let's rewind, kind of like a tape."
rewind(current_file)
print "Let's print three lines:"
current_line = 1
print_a_line(current_line, current_file)
current_line = current_line + 1
print_a_line(current_line, current_file)
current_line = current_line + 1
print_a_line(current_line, current_file)
 
特别注意一下,每次运行  print_a_line  时,我们是怎样传递当前的行号信息的。

你 应 该 看 到的 结 果

$ python ex20.py test.txt
First let's print the whole file:
To all the people out there.
I say I don't like my hair.
I need to shave it off.
Now let's rewind, kind of like a tape.
Let's print three lines:
1 To all the people out there.
2 I say I don't like my hair.
3 I need to shave it off.
$

加分习题

1. 通读脚本,在每行之前加上注解,以理解脚本里发生的事情。
2. 每次  print_a_line  运行时,你都传递了一个叫  current_line  的变量。在每次调用函
数时,打印出  current_line  的至,跟踪一下它在  print_a_line  中是怎样变成line_count  的。
3. 找出脚本中每一个用到函数的地方。检查  def  一行,确认参数没有用错。
4. 上网研究一下  file  中的  seek  函数是做什么用的。试着运行  pydoc file  看看能不能学到更多。
5. 研究一下  +=  这个简写操作符的作用,写一个脚本,把这个操作符用在里边试一下。
 

常见问题回 答

1、print_all  和其它函数里的  f  是什么?
和  Ex 18  里的一样,  f  只是一个变量名而已,不过在这里它指的是一个文件。 Python  里的文件就和老式磁带机,或者  DVD  播放机差不多。它有一个用来读取数据的“磁头”,你可以通过这个“磁头”来操作文件。每次你运行  f.seek(0)  你就回到了文件的开始,而运行f.readline()  则会读取文件的一行,然后将“磁头”移动到  \n  后面。后面你会看到更详细的解释。
 
2、问什么文件里会有间隔空行?
readline()  函数返回的内容中包含文件本来就有的  \n ,而  print  在打印时又会添加一个\n ,这样一来就会多出一个空行了。解决方法是在  print  语句结尾加一个逗号  , ,这样  print  就不会把它自己的  \n  打印出来了。
 
3、为什么  seek(0)  没有把  current_line  设为  0 ?
首先  seek()  函数的处理对象是  字节 而非行,所以  seek(0)  只是转到文件的  0 byte ,也就是第一个  byte  的位置。其次,  current_line  只是一个独立变量,和文件本身没有任何关系,我们只能手动为其增值。
 
4、+=  是什么?
英语里边 “ it is”  可以写成 “ it’s” ,” you are”  可以写成 “ you’re” ,这叫做简写。而这个操作符是吧  =  和  +  简写到一起了。  x += y  的意思和  x = x + y  是一样的。

5、readline()  是怎么知道每一行在哪里的?
readline()  里边的代码会扫描文件的每一个字节,直到找到一个  \n  为止,然后它停止读取文件,并且返回此前的文件内容。文件  f  会记录每次调用  readline()  后的读取位置,这样它就可以在下次被调用时读取接下来的一行了。


上海尚学堂Python培训编辑整理,更多Python学习资料请联系客服小姐姐获取。上海尚学堂人工智能Python最新开班信息,预定免费试听试学名额可以联系客服小姐姐咨询。

分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫