计算机科学和Python编程导论week2

授课用的python版本是2.x,如果自己用的是py3.x,昨天或者测试的时候会略有不同。
参考:
Py3.x和Py2.x区别
Python2.x与3​​.x版本区别

关于变量,全局变量和局部变量

局部变量是作用在局部的,比如说函数内部,而不受外部的影响。但是全部变量也会影响到函数内部。

# 比如下面函数f()中的y就是局部变量。
In [59]: def f(x):
    ...:     y = 1
    ...:     x = x + y
    ...:     print('x = ' + str(x))
    ...:     return x
    ...: x = 3
    ...: y = 2
    ...: 

In [60]: z = f(x)
x = 4

In [61]: x
Out[61]: 3

In [62]: y
Out[62]: 2

# 在变量前加global进行全局变量声明,来表名这个变量是属于全部变量。
# 从而来定义全局变量在代码所在函数外层的模块作用域中的,而不是在代码所在函数的作用域中的。

函数和变量传递

In [1]: def square_sum(a,b):
   ...:     c = a**2 + b**2 
   ...:     return c
   ...: 
In [2]: square_sum(3,4)
Out[2]: 25

# 例子一
In [3]: a = 1 
In [4]: def change_integer(a):
   ...:     a = a + 1
   ...:     return a
   ...: 
In [5]: print(change_integer(a))
2
In [6]: print(a)
1

# 例子二:
In [7]: b = [1,2,3]
In [9]: def change_list(b):
   ...:     b[0] = b[0] + 1
   ...:     return b
   ...: print (change_list(b))
   ...: print (b)
   ...: 
[2, 2, 3]
[2, 2, 3]

第一个例子,我们将一个整数变量传递给函数,函数对它进行操作,但原整数变量a不发生变化。
第二个例子,我们将一个表传递给函数,函数进行操作,原来的表b发生变化。
对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)
但是对于表来说,表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递)

函数中的各种参数比较

在Python函数中,当程序执行到return的时候,程序将停止执行函数内余下的语句。return并不是必须的,当没有return, 或者return后面没有返回值时,函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有,相当于C中的NULL。None多用于关键字参数传递的默认值。

参数可以有多个,也可以完全没有(但括号要保留)

下是调用函数时可使用的正式参数类型:
位置参数
关键字参数
默认参数
不定长参数

1、位置参数

# power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。
In [29]: def power(x,n):
    ...:     s = 1
    ...:     while n > 0:
    ...:         n = n - 1
    ...:         s = s * x
    ...:     return s
In [30]: power(5,2)
Out[30]: 25
In [31]: power(5,3)
Out[31]: 125

2、默认参数

#  在定义的有两个位置参数的函数power()中,只输入一个参数的时候会报错
In [32]: power(5)
Traceback (most recent call last):

  File "<ipython-input-32-1fcd865a69f9>", line 1, in <module>
    power(5)

TypeError: power() missing 1 required positional argument: 'n'

# 将第二个参数设置为默认参数进行调用如下:
In [33]: def power(x,n=2):
    ...:     s = 1
    ...:     while n > 0:
    ...:         n = n - 1
    ...:         s = s * x
    ...:     return s
    ...: 
In [34]: power(5)
Out[34]: 25

In [35]: power(8)
Out[35]: 64

In [36]: power(5,3)
Out[36]: 125

3、可变参数

# 定义可变参数,仅仅在参数前面加了一个*号。
In [37]: def calc(*numbers):
    ...:     sum = 0 
    ...:     for n in numbers:
    ...:         sum = sum + n * n
    ...:     return sum
    ...: 

In [38]: calc(1,2)
Out[38]: 5

In [39]: calc()
Out[39]: 0

4、关键字参数

# 关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
In [40]: def person(name, age, **kw):
    ...:     print('name:',name,'age:',age,'other:',kw)
    ...:     

In [41]: person('Michael',30)
name: Michael age: 30 other: {}

In [42]: person('Adam',45,gender='M',job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple
**kw是关键字参数,kw接收的是一个dict

Python的斐波那契数列

递归。所谓递归就是在函数内部调用函数本身。

In [29]: listt = []
    ...: def fib(n):
    ...:     if n == 0 or n == 1:
    ...:         return n
    ...:     else:        
    ...:         return fib(n-1) + fib(n-2)
In [53]: def testFib(n):
    ...:     for i in range(n+1):
    ...:         print('fib of ', i, '= ', fib(i))
# 比如测试下前九项斐波那契数列。但数字越大的时候后面运算的开销越大。
In [58]: testFib(8)
fib of  0 =  0
fib of  1 =  1
fib of  2 =  1
fib of  3 =  2
fib of  4 =  3
fib of  5 =  5
fib of  6 =  8
fib of  7 =  13
fib of  8 =  21
# 也可以将斐波那契数列存到一个列表里
In [57]: listt = []
    ...: for i in range(8):
    ...:     listt.append(fib(i))
    ...: print(listt)
    ...: 
[0, 1, 1, 2, 3, 5, 8, 13]

文件处理。

打开一个文件:
f = open(文件名,模式)
最常用的模式有:

"r"     # 只读
“w”     # 写入

比如
f = open("test.txt","r")
读取:
content = f.read(N)          # 读取N bytes的数据
content = f.readline()       # 读取一行
content = f.readlines()      # 读取所有行,储存在列表中,每个元素是一行。

写入:
f.write('I like apple')      # 将'I like apple'写入文件

关闭文件:
f.close()
对于视频中错题目总结
# 做一个练习题的时候py3.x中第二个出现错误,没搞懂啥原因。因为是版本造成的。
In [47]: def a(x, y, z):
    ...:      if x:
    ...:          return y
    ...:      else:
    ...:          return z
    ...: 
    ...: def b(q, r):
    ...:     return a(q>r, q, r)
    ...: 

In [48]: a(3>2, a, b)
Out[48]: <function __main__.a>

In [49]: b(a, b)
Traceback (most recent call last):

  File "<ipython-input-49-7cd669f32247>", line 1, in <module>
    b(a, b)

  File "<ipython-input-47-019acf545903>", line 8, in b
    return a(q>r, q, r)

TypeError: '>' not supported between instances of 'function' and 'function'

对于视频中的一段代码的练习,注意for循环下if和else的缩进不同的效果

In [3]: x = int(input('Enter an integer:'))
   ...: for ans in range(0, abs(x)+1):
   ...:     if ans**3 == abs(x):
   ...:         break
   ...: if ans**3 != abs(x):
   ...:     print(str(x)+'is not a perfect cube')
   ...: else:
   ...:     if x < 0:
   ...:         ans = -ans
   ...:     print('Cube root of '+str(x)+' is '+str(ans))
   ...:     

Enter an integer:-27
Cube root of -27 is -3

In [4]: x = int(input('Enter an integer:'))
   ...: for ans in range(0, abs(x)+1):
   ...:     if ans**3 == abs(x):
   ...:         break
   ...:     if ans**3 != abs(x):
   ...:         print(str(x)+'is not a perfect cube')
   ...:     else:
   ...:         if x < 0:
   ...:             ans = -ans
   ...:         print('Cube root of '+str(x)+' is '+str(ans))
   ...:         

Enter an integer:27
27is not a perfect cube
27is not a perfect cube
27is not a perfect cube

关于视频中的二分查找,来求平方根

In [46]: x= 26
    ...: epsilon = 0.01
    ...: numGuesses = 0
    ...: low = 0.0
    ...: high = x
    ...: ans = (high + low)/2.0
    ...: while abs(ans**2 - x) >= epsilon:
    ...:     print('low = ' + str(low) + ' high = ' + str(high) + ' ans = ' + str(ans))
    ...:     numGuesses += 1
    ...:     if ans**2 < x:
    ...:         low = ans
    ...:     else:
    ...:         high = ans
    ...:     ans = (high + low)/2.0
    ...: print('numGuesses = ' + str(numGuesses))
    ...: print(str(ans) + ' is close to square root of ' + str(x))
    ...: 
low = 0.0 high = 26 ans = 13.0
low = 0.0 high = 13.0 ans = 6.5
low = 0.0 high = 6.5 ans = 3.25
low = 3.25 high = 6.5 ans = 4.875
low = 4.875 high = 6.5 ans = 5.6875
low = 4.875 high = 5.6875 ans = 5.28125
low = 4.875 high = 5.28125 ans = 5.078125
low = 5.078125 high = 5.28125 ans = 5.1796875
low = 5.078125 high = 5.1796875 ans = 5.12890625
low = 5.078125 high = 5.12890625 ans = 5.103515625
low = 5.078125 high = 5.103515625 ans = 5.0908203125
low = 5.0908203125 high = 5.103515625 ans = 5.09716796875
low = 5.09716796875 high = 5.103515625 ans = 5.100341796875
numGuesses = 13
5.0987548828125 is close to square root of 26

关于课程结束后的作业

set1:
Write a program that counts up the number of vowels contained in the string s. 
Valid vowels are: 'a', 'e', 'i', 'o', and 'u'. For example, if s = 'azcbobobegghakl', your program should print:
Number of vowels: 5

ll =['a', 'e', 'i', 'o','u']
count = 0
for i in s:
    if i in ll:
        count = count + 1
print (count)
set1:
Write a program that prints the number of times the string 'bob' occurs in s. 
For example, if s = 'azcbobobegghakl', then your program should print
Number of times bob occurs is: 2

# Paste your code into this box 
count = 0
for i in range(len(s)-1):
    if s[i:i+3] == 'bob':
        count = count + 1
print(count)

参考链接:
函数的参数
python 函数
菜鸟教程 Python函数
Improve Your Python Skills

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 3,799评论 0 27
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,461评论 0 6
  • 我的暗恋,源于一场无止境的尾随与一杯一杯珍珠奶茶的堆砌。 那个男生,很高,长相清秀,很瘦,但有两坨小肉挂在嘴边。 ...
    移动的喵阅读 378评论 0 1
  • 文/ 若波特 2016年6月18日于武汉 记在父亲节的前一日,也是我父亲的生日。 我不知道你的名字但我一直都知道你...
    若波特阅读 240评论 0 2
  • 在我还未说出口之际,你便拒绝了我。
    天下唯你倾我心阅读 229评论 0 0