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

2018-07-19  本文已影响63人  瘦长的丰一禾

授课用的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

上一篇 下一篇

猜你喜欢

热点阅读